为什么在使用类似的逻辑递增两种不同的指针类型时得到不同的地址

Why am I getting different addresses when using similar logic to increment two different pointer types?

本文关键字:指针 类型 地址 两种 为什么      更新时间:2023-10-16

我不明白为什么我的浮子的地址增加了 16,而我的浮标的大小是 4。有人可以解释一下吗?

法典:

char* mychar   = new char[SIZE];
float* myfloat = new float[SIZE];
for(int i = 0; i < SIZE; i++)
{
    mychar[i] = 'A' + i;
    myfloat[i] = 101 + i; 
}
for(int i = 0; i < SIZE; i++)
    {
        cout << setw(12) << "new char @ <"  << static_cast<void*>(mychar) + sizeof(char)*i  << ">=<" << mychar[i]  << ">" 
             << setw(14) << "   new float @ <" << myfloat + sizeof(float)*i                    << ">=<" << myfloat[i] << ">n"; 
    }
cout<< "Size of float: " << sizeof(float) << endl << "Size of char: " << sizeof(char);

输出:

new char @ <0x800102e8>=<A>   new float @ <0x800102f8>=<101>
new char @ <0x800102e9>=<B>   new float @ <0x80010308>=<102>
new char @ <0x800102ea>=<C>   new float @ <0x80010318>=<103>
new char @ <0x800102eb>=<D>   new float @ <0x80010328>=<104>
Size of float: 4
Size of char: 1

请注意,myfloat是一个float*。这意味着如果你写一个表达式,比如

myfloat + n

结果将是一个指向float的指针,该指针在地址从 myfloat 开始的 float 数组中向下n位置。换句话说,在此处添加n将自动将指针递增 n * sizeof(float) 个字节,因为指针添加知道对象的大小。

因此,如果你写

myfloat + n * sizeof(float)

您不是向前跳跃 n * sizeof(float) 个字节,而是向前跳n * sizeof(float) * sizeof(float)字节,恰好是 16n 个字节。

希望这有帮助!

相关文章: