int main(int argc, char **argv)
{
int a[4] = {1, 2, 3, 4};
int *ptr = (int *)(&a + 1);
printf("%d", *(ptr - 1));
}
以下代码输出什么?
看了输出,不明白为何.
// 简化一下 这个你懂吗?
int a[4] = {1, 2, 3, 4};
int *ptr = (int *)(a + 1);
// 这里 a是数组名 本身就是地址 这个地址指向a[0]
// 这里加1 是什么? 一定向后移动了4个字节(因为数组存int
// 移动sizeof(int)长度) 指向了a【1】
printf("%d", *(ptr - 1));
//ptr 向前移动四个字节 指向a【0】
// 再来看你的题
int a[4] = {1, 2, 3, 4};
int *ptr = (int *)(&a + 1);
// 这里 a是数组名 本身就是地址 这个地址指向a[0]
// 关键是 &a 这里a==&a是一个地址 这里C的书都讲过 数组名取地址还是本身
// 但是+1就不是移动sizeof(int) 而是移动sizeof(a) 所以移动16个字节 已经指向了越界的地方 想当a【5】
printf("%d", *(ptr - 1));
//ptr 向前移动1个字节 指向a【4】 因为ptr是int* 移动sizeof(int)
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。