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
是指向 a 的指针char
。这可以与指针算法相结合,使其表现得像一个数组(例如,在任何点之后a[10]
都有 10 个条目)a
在内存中,它看起来像这样(示例取自常见问题解答):
char a[] = "hello"; // array
+---+---+---+---+---+---+
a: | h | e | l | l | o |\0 |
+---+---+---+---+---+---+
char *p = "world"; // pointer
+-----+ +---+---+---+---+---+---+
p: | *======> | w | o | r | l | d |\0 |
+-----+ +---+---+---+---+---+---+
指针和数组之间的区别很容易混淆,因为在许多情况下,数组引用“衰减”到指向它的第一个元素的指针。这意味着在许多情况下(例如传递给函数调用时)数组成为指针。如果您想了解更多信息,C 常见问题解答的这一部分详细描述了这些差异。
一个主要的实际区别是编译器知道数组的长度。使用上面的例子:
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
的 6 个数组,并且 的大小定义为 1,因此为 6。char
NUL
char
sizeof (c)
然而,指针的大小取决于实现。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 声明为指针。sizeof(p) 计算指针的大小,在大多数机器中指针的大小是 4。
也可以参考< c traps and pitfall >。