Sizeof指向数组的指针

Sizeof Pointer to Array

本文关键字:指针 数组 Sizeof      更新时间:2023-10-16

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

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告诉您表达式类型的大小。当您将0添加到a时,该类型变为指针(64位系统上为8字节)。