以下代码......
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));
生成输出
Location of array: 0x7ffd0491c574
Value of array: 17
Size of array: 12 bytes
当我在第二行使用变量数组时,它指的是“17”的位置。当我在第三个上使用它时,它取消引用指针并输出数字17.这些,我理解。
在最后一行,它打印出“12字节”作为数组的大小。为什么不打印出4个字节,因为在前两个使用同一个变量时,它似乎只能引用数组的零索引? sizeof
如何知道查看数组的其余部分,而不是仅打印出4个字节(就像我运行(sizeof(*array)
时那样)?
答案 0 :(得分:5)
传递给sizeof
时,数组名称不会衰减为指针,因此找到整个数组大小。
在第一种情况下,它衰减成指向第一个元素的指针并打印地址。
在第二种情况下,我们取消引用地址,该地址基本上是数组名称指向的地址处的值,即第一个元素。
来自C标准 $ 6.5.3.4(sizeof operator)
当应用于具有数组类型的操作数时,结果为 数组中的总字节数。
这回答了你的问题,为什么在传递一个数组名称时会显示字节数。这里的数组有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的表达。
答案 1 :(得分:1)
下面,
sizeof(number of array elements * sizeof data_type)
sizeof(3 * 4)
sizeof int
通常为4
个字节。
sizeof给出12个字节。
答案 2 :(得分:1)
这里的数组是指向3个整数数组的指针,所以如果你是数组的打印大小,它会给你12个字节,因为每个整数需要4个字节。
如您所知,数组将具有数组的起始位置,现在您使用格式说明符%d在地址“array”处打印整数。它将打印存储在数组前4个字节中的整数,即。 17.
答案 3 :(得分:0)
sizeof(*array)
会给你sizeof(int)
(在你的电脑上似乎有4个)。
sizeof(array)
给出12,因为sizeof(*array)
给出4,你有3个(int),3 x 4。
array
是内存中存储3个整数的区域
<int0><int1><int2>
^
array
sizeof(array)
给出该区域占用的空间大小。
例如,array
提及int *p = array;
将array
的地址存储在指针p
中。
答案 4 :(得分:0)
C中的数组并不是指针,这在过去很早就已经过去了。数组名称基于标识符(变量)的使用而衰减为指针。数组名称是指针,它导致包含数组成员的结构出现问题,将指针存储在数组中最终导致结构成员出现问题。因此,C的作者决定将数组作为位置的名称而不是指针的某个位置。与*一起使用时,它会衰减成指针。这允许我们将数组用作a[i], i[a], *(a+i)
。
答案 5 :(得分:-1)
sizeof()
是在编译时评估的操作数。编译器知道大小,因为它创建了数组。