【发布时间】:2021-10-07 12:18:52
【问题描述】:
有人问我以下代码的输出是什么:
int a[5] = { 1, 3, 5, 7, 9 };
int *p = (int *)(&a + 1);
printf("%d, %d", *(a + 1), *(p - 1));
3, 9- 错误
3, 12, 1
答案是NO.1
很容易得到*(a+1)是3。
但是int *p = (int *)(&a + 1); 和*(p - 1) 呢?
【问题讨论】:
-
如果您删除演员表
(int *),警告将说明发生了什么。initialization of ‘int *’ from incompatible pointer type ‘int (*)[5]’ -
Coderon,提示:避免强制转换 - 它们往往会隐藏弱代码。
-
看起来像一个在线求职面试问题
-
在我看来像是一道考试题。我希望您从这个问题中学到的一件事以及您发现它是多么难以回答的是,在现实世界的程序中进行这样的指针杂耍并不是一个好主意。
-
这里的关键是
&a中,a这个名字不会衰减为指向它第一个元素的指针,所以是的地址数组。它的类型是指向 5 个数组的指针int。
标签: c language-lawyer