12
#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
}

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

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

4

8 回答 8

19

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

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

除非它是sizeofoperator_Alignofoperator 或一元 & 运算符的操作数,或者是用于初始化数组的字符串字面量,否则类型为 ''array of type'' 的表达式将转换为类型为 ' 的表达式'pointer to type'' 指向数组对象的初始元素,不是左值。

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

C11, § 6.5.3.4sizeof_Alignof运算符

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

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

于 2013-06-26T12:39:28.837 回答
10

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

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

于 2013-06-26T12:39:25.810 回答
5

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

于 2013-06-26T12:39:19.450 回答
2

sizeof(array)给你总数组的大小,sizeof(&array[0])给你sizeof(char *)

你的问题是完美的例子Array and pointer are not same。数组可以充当指针。看看这里

于 2013-06-26T12:39:47.807 回答
1

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

于 2013-06-26T12:39:29.063 回答
1

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

于 2013-06-26T12:41:14.117 回答
-1

“数组”本身是常量指针,您不能将其寻址到不同的位置。是的,数组地址与 &array[0] 相同,它是从 & (array+0) 派生的,它等于 & (array)。我们知道 &* 被消除了,所以我们再次回到“数组”。所以 "array" 和 "&*(array+0)" 是一样的,但是对于 sizeof 运算符,操作数必须是数组表示法,而不是指针表示法。澄清:

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

char data[] = {"今天是星期天"}; ... 数组表示法

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

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

于 2018-11-25T20:54:44.377 回答
-2

我认为“数组”本身是常量指针,你不能将它寻址到不同的位置。确实可以这样写:array 与 &array[0] 相同,它是 &*(array+0) 派生的,它等于 &*(array)。我们知道 &* 被消除了,所以我们再次回到“数组”。所以 "array" 和 "&*(array+0)" 的术语在某些情况下应该是一样的,但是对于 sizeof 操作符来说就不一样了。

于 2018-11-22T21:55:47.590 回答