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

jam*_*woo 2 c++ pointers pointer-arithmetic

我不明白为什么我的花车的地址上升了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);
Run Code Online (Sandbox Code Playgroud)

输出:

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
Run Code Online (Sandbox Code Playgroud)

tem*_*def 6

请注意,这myfloat是一个float*.这意味着如果你写一个像这样的表达式

myfloat + n
Run Code Online (Sandbox Code Playgroud)

其结果将是一个指向floatn位置向下的阵列中float(胡)的地址开始于myfloat.换句话说,n这里添加将自动按n * sizeof(float)字节递增指针,因为指针添加意识到对象的大小.

因此,如果你写

myfloat + n * sizeof(float)
Run Code Online (Sandbox Code Playgroud)

你不是按n * sizeof(float)字节跳转,而是字节,而不是n * sizeof(float) * sizeof(float)字节,恰好是16n字节.

希望这可以帮助!