C int数组和指针交互

Hid*_*n14 1 c arrays pointers

以下代码......

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))?

use*_*738 5

传递给时sizeof,数组名称不会衰减为指针,因此找到整个数组大小.

在第一种情况下,它衰减成指向第一个元素的指针并打印地址.

在第二种情况下,我们取消引用地址,该地址基本上是数组名称指向的地址处的值,即第一个元素.

为什么不打印4个字节?

从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的表达.