如果我有一个像这样声明的数组:
int a[3][2];
那么为什么:
sizeof(a+0) == 8
,而:
sizeof(a) == 24
我不明白如何向指针添加0会更改sizeof
输出。是否有一些隐式类型转换?
答案 0 :(得分:12)
如果将0
添加到a
,则a
首先转换为类型int(*)[2]
的指针值(指向类型{{1}的数组的第一个元素{1}})。然后将int[3][2]
添加到其中,将0
个字节添加到该指针值表示的地址。由于该乘法产生0,因此它将产生相同的指针值。由于它是一个指针,0 * sizeof(int[2])
产生一个指针的大小,在你的盒子上是8个字节。
如果你做sizeof(a+0)
,编译器没有理由将sizeof(a)
转换为指针值(只有当你想索引元素或做涉及地址的指针算法时才有意义)要素)。因此,表达式a
保持为数组类型,并且您将获得a
的大小,而不是int[3][2]
的大小。所以,int(*)[2]
在你的盒子上是24字节。
希望这能澄清事情。
答案 1 :(得分:0)
sizeof
告诉您表达式类型的大小。将0
添加到a
时,类型将成为指针(64位系统上为8个字节)。