黑马程序员技术交流社区

标题: 解释第6题 [打印本页]

作者: 865061682    时间: 2015-7-30 10:02
标题: 解释第6题
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]后面的那个

作者: 丁铭检    时间: 2015-7-30 12:07
很难理解为什么&a+1就跳出了数组。。。
作者: wowthe1st    时间: 2015-7-30 12:23
因为&a是个指向数组的指针,即 int (*p)[5],
所以指针运算+1就是加上一整个数组的长度,跳到数组末尾后一个字节处,
即a[4]后一字节为a[5]的起始地址;
后面因为被强转成 int类型指针,再进行指针运算-1就只减去一个int的长度,
为a[4]
作者: Eil.tea    时间: 2015-7-30 12:26
*((&a+1)-1)=*(&a[5]-1) 这里看不懂,a不是数组的首地址么,怎么+1后成了a[5]?
作者: 865061682    时间: 2015-7-30 23:55
Eil.tea 发表于 2015-7-30 12:26
*((&a+1)-1)=*(&a[5]-1) 这里看不懂,a不是数组的首地址么,怎么+1后成了a[5]?

个人理解  就这样的   我也不好解释的
作者: Eil.tea    时间: 2015-7-31 00:48
865061682 发表于 2015-7-30 23:55
个人理解  就这样的   我也不好解释的

3L正解,亲测过,地址确实+了数组的内存长度,+2就成了2倍的内存长度。
作者: Daniel-Lim    时间: 2015-7-31 13:03
3L的确是正解
作者: xiaochongzi    时间: 2015-7-31 14:29
晕晕晕的
作者: Anne_lov    时间: 2015-7-31 15:56
3楼好厉害啊!我也瞬间懂了。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2