#include
#include
/* run this program using the console pauser or add your own getch, system("pause") or input loop */ int main(int argc, char *argv[]) { int a[5]={1,2,3,4,5}; int *ptr1=(int *)(&a+1); int *ptr2=(int *)((int)a+1); printf("%d,%d",ptr1[-1],*ptr2); return 0; }
上测试程序来自《C语言深度解析》中的一个习题:
分析如下:
先打印出结果:

格式符变一下;;;;
printf("%d,%p",ptr1[-1],*ptr2);

ptr1[-1]结果为5,很显然,这个表达式看上去乖乖的,但是编译器并未报错 运行正常,,个人认为这个结果完全正确!
ptr1指针指向数组最后一个元素接下来的那个地址,ptr1[-1]这磊 http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcHRyMc/gtbHT2sr91+nD+2G1xNf308OjrC0xvs3N+brzzcvSu7j2yv3X6dSqy9i089ChtcTE2rTmtaXUqqOs0rK+zcrHYVs0Xcv51Nq1xLXY1re1pdSqPC9wPgo8cD7K5LP2NcrH1f3It7XEo6E8L3A+CjxwPjxicj4KPC9wPgo8cD4qcHRyMiAgICA9ICAgMj8/P7K7o6GjoaOho6E8L3A+CjxwPqOoaW50o6lhJiM0Mzsx0+thJiM0MzsxysfN6sirsrvNrLXEwb249rarzveho8Tjx/i31sP3sNfBy8S+09Cho6GjoaOhozwvcD4KPHA+PHByZSBjbGFzcz0="brush:java;">#include
#include
/* run this program using the console pauser or add your own getch, system("pause") or input loop */ int main(int argc, char *argv[]) { int a[5]={1,2,3,4,5}; int *ptr1=(int *)(&a+1); int *ptr2=(int *)((int)a+1); printf("%p\n",(int *)(int)a+1);//0022ff28 printf("%d,%p",ptr1[-1],*ptr2); return 0; }
*ptr2的值就是内存单元0022ff28内存储存的内容!鬼知道编译器是怎么想的