指向数组的指针大小

use*_*652 8 c++ pointers

如果我有一个像这样声明的数组:

int a[3][2];
Run Code Online (Sandbox Code Playgroud)

那么为什么:

sizeof(a+0) == 8
Run Code Online (Sandbox Code Playgroud)

然而:

sizeof(a)   == 24
Run Code Online (Sandbox Code Playgroud)

我不明白如何向指针添加0会改变sizeof输出.可能有一些隐式类型转换吗?

Joh*_*itb 12

如果添加0a,则a首先将其转换为类型的指针值int(*)[2](指向类型数组的第一个元素int[3][2]).然后0添加到那个,它将0 * sizeof(int[2])字节添加到由该指针值表示的地址.由于该乘法产生0,因此它将产生相同的指针值.因为它是一个指针,所以sizeof(a+0)产生指针的大小,这是你的盒子上的8个字节.

如果这样做sizeof(a),编译器没有理由转换a为指针值(只有当你想索引元素或做涉及元素地址的指针算术时才有意义).因此表达式a保持为数组类型,而您获得的大小int[3][2]相反int(*)[2].那么,3 * 2 * sizeof(int)你的盒子上有24个字节.

希望这能澄清事情.

  • @ RemyLebeau-TeamB:`a [0]`相当于`*(a + 0)`,而不是`(a + 0)`. (2认同)