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

Lyr*_*yrk 12 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
}
Run Code Online (Sandbox Code Playgroud)

上面的代码给出了20for sizeof(array)4for sizeof(&array[0]).

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

md5*_*md5 18

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

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

除非它是运算sizeof,_Alignof运算符或一元&运算符的操作数,或者是用于初始化数组的字符串文字,否则将类型为''数组'的数组的表达式转换为类型为'的表达式'指向类型'的指针,指向数组对象的初始元素,而不是左值.

因此,它的类型char[20]不是char *.这种类型的大小是sizeof(char) * 20 = 20字节.

C11,§6.5.3.4 sizeof_Alignof操作员

sizeof操作者产生其操作数的大小(以字节为单位),其可以是表达或类型的括号名称.大小由操作数的类型确定.

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


Mar*_*oun 10

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

&array[0]是一个指针.将sizeof返回一个指针,它是在你的机器4的大小.


Som*_*ude 5

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