为什么sizeof(array)和sizeof(& array [0])给出不同的结果?

时间:2013-06-26 12:37:17

标签: c sizeof

#include <stdio.h>
int main(void){
    char array[20];

    printf( "\nSize of array is %d\n", sizeof(array) );  //outputs 20
    printf("\nSize of &array[0] is %d\n", sizeof(&array[0]); //output 4
}

上面的代码为20提供sizeof(array),为4提供sizeof(&array[0])

我所知道的不是将数组作为参数,而是可以传递它的第一个元素。他们不应该给出与20相同的输出吗?为什么&array[0]给出了4个结果?据我所知,char存储在1个字节中?

8 个答案:

答案 0 :(得分:18)

在表达式sizeof array中,array未转换为指针类型。

  

C11,§6.3.2.1左值,数组和函数指示符

     

,当它是sizeof运算符的操作数时,_Alignof运算符或一元&amp;运算符运算符,或者是用于初始化数组的字符串文字,具有类型''数组类型''的表达式将转换为类型为''指向类型'的指针的表达式,指向数组对象的初始元素,不是左值。

因此,其类型为char[20],而非char *。此类型的大小为sizeof(char) * 20 = 20个字节。

  

C11,§6.5.3.4sizeof_Alignof运营商

     

sizeof运算符产生其操作数的大小(以字节为单位),可以是   表达式或类型的括号名称。 大小取决于操作数的类型

&array[0]类型为char *。这就是为什么sizeof(&array[0])给出与sizeof(char *)相同的结果(机器上的4个字节)。

答案 1 :(得分:10)

变量array是一个20 char的数组,表达式sizeof(array)的值等于20 chars数组的字节大小,这是20

&array[0]指针sizeof返回指针的大小,在你的机器中为4。

答案 2 :(得分:4)

表达式&array[0]指针,因此sizeof运算符返回指针的大小。

答案 3 :(得分:2)

sizeof(array)为您提供了总数量的大小,而sizeof(&array[0])正在为您提供sizeof(char *)

您的问题是Array and pointer are not same的完美示例。数组可以充当指针。Have a look here

答案 4 :(得分:1)

&array[0]返回指向数组第一个索引的指针。在指针上使用sizeof运算符将产生指针的大小(取决于ABI),在您的情况下,它是4。

答案 5 :(得分:1)

sizeof(&array[0])返回指向char的指针的大小。 array[0]产生一个char,&返回一个指向char的指针。您的编译器使用4个字节作为指针(32位)。

答案 6 :(得分:-1)

“数组”本身是常量指针,不能将其寻址到其他位置。是的,数组地址与&array [0]相同,后者由&(array + 0)派生,并且等于&(array)。我们知道&*被消除了,所以我们再次回到“数组”。因此,“数组”与“&*(array + 0)”相同 但是对于sizeof运算符,操作数必须采用数组表示法,而不是指针表示法。 要澄清:

char * data = {“今天是星期日”}; ...指针符号

字符数据[] = {“今天是星期天”}; ...数组符号

在第一个使用指针符号的示例中,sizeof(data)将是存储地址所需的字节大小,在我的系统上为8。在第二个示例中,sizeof(data)将给出数组占用的字节数,该字符串中的字符数为15个字符。但是,如果使用像sizeof(data + 0)这样的指针表示法,结果将是存储地址所需的字节数,在我的系统上为8。

sizeof运算符的结果对于指针和带有指针符号的数组是相同的。

答案 7 :(得分:-2)

我认为“数组”本身是常量指针,不能将其寻址到其他位置。 确实可以写:array与&array [0]相同,它是从&*(array + 0)派生的,它等于&*(array)。我们知道&*被消除了,所以我们再次回到“数组”。因此,“数组”与“&*(array + 0)”相同 在某些情况下,术语应相同,但对sizeof运算符而言,则不相同。