C语言数组问题

int main(int argc, char **argv)
{
    int a[4] = {1, 2, 3, 4};
    int *ptr = (int *)(&a + 1);
    printf("%d", *(ptr - 1));
}

以下代码输出什么?
看了输出,不明白为何.

阅读 3.5k
2 个回答

有点意思
有意思~~~ 我来玩玩 玩完这个睡觉觉
神奇的& 明白了这个你就明白了

// 简化一下 这个你懂吗?
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)

因为&a 的类型 是 int (*)[4]. 指向数组的指针.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进