A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 默默者 中级黑马   /  2014-4-27 22:01  /  1061 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

为什么下面代码的第二个输出是5,求解答一下。
int a[5] = {1,2,3,4,5};
int *p = (int *)(&a+1);
NSLog(@"%d,%d", *(a+1), *(p-1));

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

3 个回复

倒序浏览
int *p = (int*)(&a+1);  // &a的类型是int[5],所以&a+1是要加上一个a[5]的大小,也就是5*sizeof(int),所以pa指向a[5]的位置
pa指向a[5],所以*(pa-1)是a[4]即是5
回复 使用道具 举报
int *p = (int *)(&a+1)中的&a是对整个数组a取地址和&a[0]取数组的首地址不一样。
&a[0]取的是数组的首地址,&a[0]+1取的是数组的第二个元素的地址。
但是&a取的是整个数组所存的地址,因此&a+1取的的是整个数组的存储空间的下一位地址也就是数组第五个元素的下一位。所以p的地址就在数组a[5]之后。又因为&a是整型数组a的地址,+1就是与数组a对应的下一个数组的存储空间,将&a+1强制转换成整型指针赋值给整型指针p,这时的p指针加1或是减1就是对整型变量这么大的存储空间寻址。也就是意味着p+1就是指向与p相距4个字节远的地址,p-1就是指向p的上一个整型变量的地址。因为p指向a[5]的下一位,那么p-1就是指向a[5],p-1就是a[5]的地址,所以输出结果为5

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马