一分钟考考你 —— 测试题1

下面代码段的输出是多少?

int a[] = {1, 2, 3, 4, 5};
int *p = (int *)(&a+1);
printf("%d, %d\n", *(a+1), *(p-1));

这里的重点是&a+1的结果,因为a是数组,所以&a相当于一个二维数组的行指针,加1后指向a数组尾部的下一个字节。所以 * (p-1)就是a数组的最后一个元素,即5。而 * (a+1)显然就是2

int p = (int )(&a+1); &a是数组首地址,而不是数组首元素地址,所以&a+1直接跳过整个数组,也即数组末尾,快要越界了,所以(p-1)就是数组末尾的地址减一整体取为5,这个时候是面向每一个数组元素的,因为是减一整体再取*
printf("%d, %d\n", *(a+1), (p-1));
(a+1)是数组首元素地址加1整体取,这个时候是面向每一个数组元素的地址加减取整体
,它和上面的数组首地址&a不一样
下面是对上面问题的详细解答,欢迎各位来访呀
http://t.csdn.cn/tJBPY

运行一下就知道了,懒得想,哈哈

img

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^