这是我的代码:
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);
和:
printf("%p\n", num);
?
不应该打印指针本身的地址和num打印存储M的“单元格”的地址?
发布于 2018-06-04 10:19:22
不,数组不是指针。但它可以衰减到指向其第一个元素的指针。这与为什么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]
指向同一个位置,但属于不同的类型。
在另一个说明中,请记住char
C中的字符串实际上被称为以空字符结尾的字节字符串。这个空终止符使得一个字符串成为一个字符串,所有的字符串处理函数都使用这个终结符来知道字符串的末尾在哪里。
你阵列没有这个终结者的空间。
https://stackoverflow.com/questions/-100004721
复制相似问题