以下代码......
int array[] = {17, 18, 19};
printf("Location of array: %p\n", array);
printf(" Value of array: %d\n", *array);
printf(" Size of array: %d bytes\n", sizeof(array));
Run Code Online (Sandbox Code Playgroud)
产生输出
Location of array: 0x7ffd0491c574
Value of array: 17
Size of array: 12 bytes
Run Code Online (Sandbox Code Playgroud)
当我在第二行使用变量数组时,它指的是"17"的位置.当我在第三个上使用它时,它取消引用指针并打印出数字17.这些,我理解.
在最后一行,它打印出"12字节"作为数组的大小.为什么不打印出4个字节,因为在前两个使用同一个变量时,它似乎只能引用数组的零索引?如何sizeof
知道查看数组的其余部分,而不是只打印4个字节(就像我运行时那样(sizeof(*array)
)?
传递给时sizeof
,数组名称不会衰减为指针,因此找到整个数组大小.
在第一种情况下,它衰减成指向第一个元素的指针并打印地址.
在第二种情况下,我们取消引用地址,该地址基本上是数组名称指向的地址处的值,即第一个元素.
从C标准$ 6.5.3.4(sizeof运算符)
当应用于具有数组类型的操作数时,结果是数组中的总字节数.
这回答了你的问题为什么当传递一个数组名称时它会显示字节数.这里的数组有3个元素,每个元素大小sizeof int
或4个字节在你的系统中,所以total size = 3*4 = 12
*array
?*array
除此之外别无他物array[0]
.array
衰减到指向数组的第一个元素的指针,然后我们取消引用它.有什么价值?这是值17.
sizeof(*array)=4
?好吧,如果你还记得array
是一个3个整数的数组.所以当然,它所包含的价值是类型的int
.在你的系统中sizeof int
是4个字节.这就是为什么你会得到4分的原因sizeof *array
.
sizeof
?sizeof
由编译器实现.对于非VLA类型的对象sizeof
是一个常量,它是解析编译时的.但是在VLA的情况下,阵列大小在运行时是已知的并且生成结果.所以这是VLA的表达.