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

C 为什么整数数组大小(数组)的返回值仅为元素数的4倍?,c,arrays,pointers,C,Arrays,Pointers,例如,如果我执行以下操作 int array[5] = {1, 2, 3, 4, 5}; printf("%d", sizeof(array)); 它将返回元素的4倍,即5=20 但我的问题是数组不需要指针吗?(地址) 如果是这样的话,既然指针的大小是8字节,为什么它不包括在大小中呢 但我的问题是数组不需要指针吗?(地址) 没有。数组只是一个对象序列——在本例中,是一个5int的序列: +–––+ array: | 1 | array[0] +–––+

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

int array[5] = {1, 2, 3, 4, 5};
printf("%d", sizeof(array));
它将返回元素的4倍,即5=20

但我的问题是数组不需要指针吗?(地址) 如果是这样的话,既然指针的大小是8字节,为什么它不包括在大小中呢

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

没有。数组只是一个对象序列——在本例中,是一个5
int
的序列:

       +–––+
array: | 1 | array[0]
       +–––+
       | 2 | array[1]
       +–––+
       | 3 | array[2]
       +–––+
       | 4 | array[3]
       +–––+
       | 5 | array[4]
       +–––+
没有为任何指针留出空间-表达式
数组
将被转换(“衰减”)为指针表达式,以使其计算结果为第一个元素的地址(除非它是
sizeof
或一元
&
运算符的操作数)

如果是这样的话,既然指针的大小是8字节,为什么它不包括在大小中呢

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

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

没有。数组只是一个对象序列——在本例中,是一个5
int
的序列:

       +–––+
array: | 1 | array[0]
       +–––+
       | 2 | array[1]
       +–––+
       | 3 | array[2]
       +–––+
       | 4 | array[3]
       +–––+
       | 5 | array[4]
       +–––+
没有为任何指针留出空间-表达式
数组
将被转换(“衰减”)为指针表达式,以使其计算结果为第一个元素的地址(除非它是
sizeof
或一元
&
运算符的操作数)

如果是这样的话,既然指针的大小是8字节,为什么它不包括在大小中呢

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

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

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

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


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

我想你需要澄清你的问题相当一点这里有一个提示,什么是
sizeof(int)
?数组不是指针,指针也不是数组,但是数组被转换成访问指针,这取决于@KeithThompson中包含的四个异常——每天学习新东西——这使它成为一个好日子。谢谢。另外,为了挑剔,运算符
sizeof
的返回值类型是
size\t
,因此您应该使用
%zu
而不是
%d
。我认为您需要澄清您的问题。这里有一个提示,什么是
sizeof(int)
?数组不是指针,指针也不是数组,但是数组被转换成访问指针,这取决于@KeithThompson中包含的四个异常——每天学习新东西——这使它成为一个好日子。谢谢。另外,为了挑剔,运算符
sizeof
的返回值类型是
size\u t
,因此您应该使用
%zu
而不是
%d