1
char c[] = "Hello";
char *p = "Hello";

printf("%i", sizeof(c)); \\Prints 6
printf("%i", sizeof(p)); \\Prints 4

我的问题是:

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

4

5 回答 5

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)
于 2013-08-24T02:52:23.183 回答
1

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

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

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

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

于 2013-08-24T02:40:33.390 回答
0

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

于 2013-08-24T02:33:57.557 回答
0

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

于 2013-08-24T02:40:57.783 回答
0

指针和数组是不同的。

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

也可以参考< c traps and pitfall >。

于 2013-08-24T02:47:22.460 回答