#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)
上面的代码给出了20
for sizeof(array)
和4
for 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的大小.