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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 865061682 中级黑马   /  2015-7-30 10:02  /  880 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

6.下列程序运行结果正确的是(A )
int a[] = {1, 2, 3, 4, 5};
int *p = (int*)(&a + 1);
printf("%d, %d\n", *(a+1), *(p-1));
A. 2,5      B. 2,1      C. 1,5     D. 1,1
*(a+1)=a[1]=2
*(p-1)=*((&a+1)-1)=*(&a[5]-1)=*(&a[4])=a[4]=5
这里说的a[5]表示的是数组a后面的那个其实就是越界了的  接在a[4]后面的那个

8 个回复

倒序浏览
很难理解为什么&a+1就跳出了数组。。。
回复 使用道具 举报
因为&a是个指向数组的指针,即 int (*p)[5],
所以指针运算+1就是加上一整个数组的长度,跳到数组末尾后一个字节处,
即a[4]后一字节为a[5]的起始地址;
后面因为被强转成 int类型指针,再进行指针运算-1就只减去一个int的长度,
为a[4]
回复 使用道具 举报
*((&a+1)-1)=*(&a[5]-1) 这里看不懂,a不是数组的首地址么,怎么+1后成了a[5]?
回复 使用道具 举报
Eil.tea 发表于 2015-7-30 12:26
*((&a+1)-1)=*(&a[5]-1) 这里看不懂,a不是数组的首地址么,怎么+1后成了a[5]?

个人理解  就这样的   我也不好解释的
回复 使用道具 举报
865061682 发表于 2015-7-30 23:55
个人理解  就这样的   我也不好解释的

3L正解,亲测过,地址确实+了数组的内存长度,+2就成了2倍的内存长度。
回复 使用道具 举报
3L的确是正解
回复 使用道具 举报
晕晕晕的
回复 使用道具 举报
3楼好厉害啊!我也瞬间懂了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马