下面代码段的输出是多少?
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
运行一下就知道了,懒得想,哈哈