分析以下程序,输出结果 2,5
#includeint main() { int a[5]={ 1,2,3,4,5}; int *ptr=(int *)(&a+1); printf("%d,%d",*(a+1),*(ptr-1)); return 0;}
分析:
a 代表的是int * 每次步长为一个int;
&a 代表的是 int[]* 每次步长为所指向的数组的大小。(&a是数组指针,其类型是int(*)[5])
故
ptr 指向的是数组a最后一个元素的下一个元素
所以ptr-1指向的是数组a的最后一个元素
*(a+1)指向的是数组a的第二个元素,等价于a[1]。
补充:对数组名取地址,&a,得到的是整个数组的首地址,是与数组首元素的地址是相等的,但是意义不同。
所以(a+1)是将地址值加4(一个int占4个字节大小),而&a+1是将地址值加20(数组大小为4字节*5个int类型的数字)。
注意:int *p=(int *)&a+1; 与 int *ptr=(int *)(&a+1);是不同的。
#includeint main() { int a[5]={ 1,2,3,4,5}; int *ptr=(int *)(&a+1); printf("%d,%d",*(a+1),*(ptr-1)); int *p=(int *)&a+1; printf("\n%d",*p); return 0;}