使用指针声明的数组大小
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陷阱和陷阱 >。