使用指针声明的数组大小

char c[] = "Hello"; char *p = "Hello"; printf("%i", sizeof(c)); \\Prints 6 printf("%i", sizeof(p)); \\Prints 4 

我的问题是:

为什么这些打印出不同的结果? 不是c[]也声明一个指向数组第一个字符的指针(因此它的大小应该是4,因为它是一个指针)?

听起来你在指针和数组之间感到困惑。 指针和数组(在本例中为char *char [] ) 不是一回事。

  • 数组char a[SIZE]表示a位置的值是长度为SIZE的数组
  • 指针char *a;a的位置的值是一个指向char的指针。 这可以与指针算法结合使用,就像一个数组(例如, a[10]是10个条目,无论哪个点都可以)

在内存中,它看起来像这样(例子来自FAQ ):

  char a[] = "hello"; // array +---+---+---+---+---+---+ a: | h | e | l | l | o |\0 | +---+---+---+---+---+---+ char *p = "world"; // pointer +-----+ +---+---+---+---+---+---+ p: | *======> | w | o | r | l | d |\0 | +-----+ +---+---+---+---+---+---+ 

很容易混淆指针和数组之间的区别,因为在很多情况下,数组引用“衰减”到指向它的第一个元素的指针。 这意味着在许多情况下(例如传递给函数调用时)数组成为指针。 如果您想了解更多信息, C FAQ的这一部分将详细介绍差异 。

一个主要的实际区别是编译器知道数组有多长。 使用上面的例子:

 char a[] = "hello"; char *p = "world"; sizeof(a); // 6 - one byte for each character in the string, // one for the '\0' terminator sizeof(p); // whatever the size of the pointer is // probably 4 or 8 on most machines (depending on whether it's a // 32 or 64 bit machine) 

sizeof的两个操作数有不同的类型。 一个是char数组,另一个是char的指针。

C标准表示当sizeof运算符应用于数组时,结果是数组中的总字节数。 c是包含NUL终止符的六个char的数组, char的大小定义为1,因此sizeof (c)为6。

但是,指针的大小取决于实现。 p是指向char的指针。 在您的系统上,指向char的指针的大小恰好是4个字节。 这就是你用sizeof (p)看到的。

但是,如果尝试sizeof(*p)sizeof(*c) ,它们都将计算为1,因为解除引用的指针和数组的第一个元素都是char类型。

它们不打印相同,因为数组和指针不一样。 他们没有理由相同。 在许多情况下,数组会隐式转换为指针,但这并不会使它们相同。

“sizeof”是编译器的指令。 结果表明参数占用的内存大小。 编译器负责根据参数的类型确定结果。 关于“数组”,返回数组大小。 此外,对于32位机器,指针通常返回“4”。

指针和数组是不同的。

char c[] = "Hello"; //将c声明为数组。 sizeof(c)计算数组6的大小。
char *p = "Hello"; //声明p作为pointer.sizeof(p)计算指针的大小,在大多数机器中指针的大小为4。

你也可以参考< c陷阱和陷阱 >。