int a[5] = {1,2,3,4,5};
int *ptr = (int *)(&a + 1);
int *p1 = a;
int *p2 = &a[0];
int *p3 = (int *)(&a);
p1 == p2 == p3 全為真,輸出 2 5。&a 類型為 int (*)[5],&a + 1 跳過整個數組(+5*sizeof(int))。ptr = (int*)(&a+1) 強轉為 int*,指向數組尾後位置。*(ptr-1):ptr 作為 int* 向前移一個 sizeof(int),落在 a[4],值為 5。p3 = (int*)(&a) 強轉後類型為 int*,指向 a[0],故 p1==p3。若無強轉編譯報錯。++p1、++p3 同為 int* 步長相同,故 p4==p5。&a 步長為整個數組,int* 步長為單個 int。(int*)(&a) 與 &a 地址相同但類型不同。a、&a、&a[0] 地址值相同,但類型分別為 int*、int(*)[5]、int*。此題考察指鈐類型、地址運算、強制轉換三者交互。許多開發者混淆「地址值相同」與「類型相同」,導致指鈐運算出錯。牢記:指鈐類型決定解引用大小與運算步長,強轉僅改變類型不改變地址值。