开发者社区> 问答> 正文

C语言数组问题

int main(int argc, char **argv)
{
    int a[4] = {1, 2, 3, 4};
    int *ptr = (int *)(&a + 1);
    printf("%d", *(ptr - 1));
}
以下代码输出什么?
看了输出,不明白为何.

展开
收起
a123456678 2016-06-08 20:29:35 1566 0
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)
    2019-07-17 19:32:43
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载

相关实验场景

更多