首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >用C[重复]打印数组名称的地址

用C[重复]打印数组名称的地址
EN

Stack Overflow用户
提问于 2018-06-04 01:16:53
回答 1查看 0关注 0票数 0

这是我的代码:

代码语言:javascript
复制
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;
}

为什么我会得到相同的地址:

代码语言:javascript
复制
printf("%p\n", &num);

和:

代码语言:javascript
复制
printf("%p\n", num);

?

不应该打印指针本身的地址和num打印存储M的“单元格”的地址?

EN

回答 1

Stack Overflow用户

发布于 2018-06-04 10:19:22

不,数组不是指针。但它可以衰减到指向其第一个元素的指针。这与为什么num相同&num[0]。这个指针的类型是char *

表达式&num是完全不同的,因为它是一个指向数组本身的指针。这种类型是char (*)[11]。恰恰相反,两者num(因此&num[0])和&num指向相同的位置,但由于它们是不同的类型,它们在语义上是不同的。

有点“图形”你可以看到你的数组是这样的:

代码语言:javascript
复制
+---+---+---+---+---+---+---+---+---+---+---+
| 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]指向同一个位置,但属于不同的类型。

在另一个说明中,请记住charC中的字符串实际上被称为以空字符结尾的字节字符串。这个空终止符使得一个字符串成为一个字符串,所有的字符串处理函数都使用这个终结符来知道字符串的末尾在哪里。

你阵列没有这个终结者的空间。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100004721

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档