【发布时间】:2011-10-13 19:03:55
【问题描述】:
如果我有一个这样声明的数组:
int a[3][2];
那为什么是:
sizeof(a+0) == 8
而:
sizeof(a) == 24
我不明白将 0 添加到指针如何更改 sizeof 输出。可能有一些隐式类型转换吗?
【问题讨论】:
如果我有一个这样声明的数组:
int a[3][2];
那为什么是:
sizeof(a+0) == 8
而:
sizeof(a) == 24
我不明白将 0 添加到指针如何更改 sizeof 输出。可能有一些隐式类型转换吗?
【问题讨论】:
如果将0 添加到a,则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 字节。
希望这可以澄清事情。
【讨论】:
sizeof(a+0)和sizeof(a[0])是一样的,都是取数组中第一个int[2]元素的大小,所以sizeof(int)*2 = 8。它没有占用指针的大小。
a[0] 等价于*(a+0),而不是(a+0)。
sizeof 告诉你表达式类型的大小。当您将0 添加到a 时,类型变为指针(在 64 位系统上为 8 个字节)。
【讨论】: