为什么整数数组大小(数组)的返回值只是元素数的4倍?

时间:2019-06-04 02:52:27

标签: c arrays pointers

例如,如果我执行以下操作,

int array[5] = {1, 2, 3, 4, 5};
printf("%d", sizeof(array));

它将返回4倍的元素数,即5 = 20。

但是我的问题是数组不要求指针吗?(地址) 如果是这样,由于指针的大小为8个字节,为什么不将其包含在大小中?

2 个答案:

答案 0 :(得分:2)

  

但是我的问题是数组不要求指针吗?(地址)

不。数组只是对象序列-在这种情况下,是5 int的序列:

       +–––+
array: | 1 | array[0]
       +–––+
       | 2 | array[1]
       +–––+
       | 3 | array[2]
       +–––+
       | 4 | array[3]
       +–––+
       | 5 | array[4]
       +–––+

没有任何指针留出空间-表达式 array将被转换(“衰变”)为指针表达式,从而求出第一个元素的地址(除非它是sizeof或一元&运算符的操作数)。

  

如果是这样,由于指针的大小为8个字节,为什么不将其包含在大小中?

不要假设指针具有特定的大小-仍在使用16位和32位系统,并且指向不同类型的指针不必具有相同的大小和表示形式。全世界不是 VAX x86-64。

答案 1 :(得分:0)

以array [5]为例 对于 float int 类型数组,它显示的 size为20 (而float的大小为4而int为2似乎都拥有相同的空间(不知道为什么) 因此,假设32位机器的指针大小为4,则数组的大小为4 * 5 = 20 但是对于 char 类型数组,它会显示 size为5 (即这次未乘以4) 这次在同一台机器上,根据输出,指针大小必须为1。 对于 double 类型数组,它显示 size为40 (5 * 8),因此指针大小必须为8

这不仅是32位4或64位8,而且对于不同的数据类型也不同