问题描述:
有如下程序:
#include<stdio.h> int main(void) { int a[5] = {1,2,3,4,5}; int *ptr = (int *)(&a + 1); printf("%d %d\n", *(a + 1), *(ptr-1)); return 0; }
输出结果:2 5
原因解释:
*(a+1) 因为a的地址为数组a第一个元素的地址,所以a+1就是a的第二个元素的地址 输出为2
&a的类型是int[5],则&a+1的偏移量为整个数组a的大小 换句话说它也表示了该数组最后一个元素的下一个地址,上面的ptr则是一个指向int[5]的值针。
所以ptr-1指向数组a最后一个元素 *(ptr-1)输出为5.
由上可知 ,&a+1 比a+5 和 &a[5]使用更方便: 它不必知道将要操作的数组的sizeof