下面程序最终显示结果是什么?
#include <stdio.h>
int main()
{
int a[5]={1,2,3,4,5};
int *ptr1=(int *)(&a+1);
int *ptr2=(int *)((int )a+1);
printf("%x,%x",ptr1[-1],*ptr2);
return 0;
}
tc 编译
5,200
指针的步进是参照其所指对象的大小;
虽然a=&a;但a是一个指向数组第一个元素的指针,a+1=a+sizeof(int);
而&a产生一个指向全部数组的指针,&a+1=(int)a+sizeof(a);
&a 就相当与一个指向数组的指针 如int (*p)[5]。
&a 取得地址以后加一的操作,指针增加了sizeof(a)这么多的绝对地址。这应该是指针加了20,然后一个-1有减去了4,这样相当于指针的绝对地址加了16,指向的就是a[4]的首地址
a 的内存存放
地址: 00 01 02 03 04 05 06 07 08
数据: 01 00 02 00 03 00 04 00 05
a = 00;
ptr2 = (int*)((int)a + 1);
ptr2 = 01;
所以ptr2指向的内存为
地址: 01 02
数据: 00 02
即*ptr2 = 0x200;