#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]這磊喎?/kf/ware/vc/" target="_blank" class="keylink">vcHRyMc/gtbHT2sr91+nD+2G1xNf308OjrC0xvs3N+brzzcvSu7j2yv3X6dSqy9i089ChtcTE2rTmtaXUqqOs0rK+zcrHYVs0Xcv51Nq1xLXY1re1pdSqPC9wPgo8cD7K5LP2NcrH1f3It7XEo6E8L3A+CjxwPjxicj4KPC9wPgo8cD4qcHRyMiAgICA9ICAgMj8/P7K7o6GjoaOho6E8L3A+CjxwPqOoaW50o6lhJiM0Mzsx0+thJiM0MzsxysfN6sirsrvNrLXEwb249rarzveho8Tjx/i31sP3sNfBy8S+09Cho6GjoaOhozwvcD4KPHA+PHByZSBjbGFzcz0="brush:java;">#include
*ptr2的值就是內存單元0022ff28內存儲存的內容!鬼知道編譯器是怎麼想的