#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个字节中?
答案 0 :(得分:18)
在表达式sizeof array
中,array
未转换为指针类型。
C11,§6.3.2.1左值,数组和函数指示符
,当它是
sizeof
运算符的操作数时,_Alignof
运算符或一元&amp;运算符运算符,或者是用于初始化数组的字符串文字,具有类型''数组类型''的表达式将转换为类型为''指向类型'的指针的表达式,指向数组对象的初始元素,不是左值。
因此,其类型为char[20]
,而非char *
。此类型的大小为sizeof(char) * 20 = 20
个字节。
C11,§6.5.3.4
sizeof
和_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运算符而言,则不相同。