:)
这是我的代码:
int main(void)
{
char num[11] = { "Mississippi" };
printf("%p\n", &num); // prints 0x7fffe44a5eb0
printf("%p\n", num); // prints 0x7fffe44a5eb0
printf("%c\n", *num); // prints M
return EXIT_SUCCESS;
}
为什么我会获得相同的地址:
printf("%p\n", &num);
和for:
printf("%p\n", num);
不应该打印指针本身的地址,并且打印“'”单元格的地址。 M存储在哪里?
任何输入都非常感谢! 欢呼声
答案 0 :(得分:3)
不,数组不是指针。但它可以衰减指向其第一个元素的指针。这就是num
与&num[0]
相同的原因。该指针的类型为char *
。
表达式&num
是完全不同的,因为它是指向数组本身的指针。其类型为char (*)[11]
。事实恰恰相反,num
(因此&num[0]
)和&num
都指向同一位置,但由于它们是不同的类型,因此它们在语义上是不同的。
有点"图形"你可以看到你的数组:
+---+---+---+---+---+---+---+---+---+---+---+ | M | i | s | s | i | s | s | i | p | p | i | +---+---+---+---+---+---+---+---+---+---+---+ ^ ^ ^ ^ | | | | | | &num[2] ... &num[11] | | | | &num[1] (&num)[1] | &num[0] | &num
重复一遍,普通num
将衰变(即由编译器翻译)到&num[0]
。 &num
和&num[0]
都指向同一位置,但属性不同。
另外请注意,请记住C中的char
字符串实际上称为 空终止 字节字符串。这个 null-terminator 是使字符串成为字符串的原因,所有字符串处理函数都使用此终结符来知道字符串结尾的位置。
您的数组没有此终结符的空间。