C int数组和指针交互

时间:2017-12-11 05:21:41

标签: 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));

生成输出

Location of array: 0x7ffd0491c574
   Value of array: 17
    Size of array: 12 bytes

当我在第二行使用变量数组时,它指的是“17”的位置。当我在第三个上使用它时,它取消引用指针并输出数字17.这些,我理解。

在最后一行,它打印出“12字节”作为数组的大小。为什么不打印出4个字节,因为在前两个使用同一个变量时,它似乎只能引用数组的零索引? sizeof如何知道查看数组的其余部分,而不是仅打印出4个字节(就像我运行(sizeof(*array)时那样)?

6 个答案:

答案 0 :(得分:5)

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

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

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

为什么不打印4个字节?

来自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()是在编译时评估的操作数。编译器知道大小,因为它创建了数组。