int a[5] = {1,2,3,4,5};
int *p = (int *)(&a + 1);
printf("%d\n", *(p - 1)); // 輸出為何?
&a 的型別a:數組名,在多數上下文中退化為指向首元素的指標(int*)。&a:取整個數組的地址,型別為 指向含 5 個 int 的數組的指標,即 int (*)[5](行指標)。&a + 1 會使指標前移 一個數組的大小,即 5 * sizeof(int) 位元組。結果指向緊隨數組 a 之後的記憶體位置(越界一個元素位置)。
int *p = (int *)(&a + 1); // 轉為 int*,指向 a[5](越界位置)
*(p - 1) // 向前移動一個 int 大小,落在 a[4],值為 5
#include
int main() {
int a[5] = {1,2,3,4,5};
int *p = (int *)(&a + 1);
printf("%p\n%p\nbit = %td\n", (void*)a, (void*)p, p - a);
printf("%d\n", *(p - 1));
return 0;
}

輸出顯示 p - a = 5,確認 &a + 1 跳過了 5 個 int。*(p-1) 即 a[4] = 5。
索引: 0 1 2 3 4 5(越界) 數值: 1 2 3 4 5 * a: [1][2][3][4][5] &a+1 ──────────────────────► * p (int*) ──────────────────► * p-1 ─────────────────────► 5
對於 int a[3][4]:
a → int (*)[4](指向含 4 個 int 的數組)a + 1 跳過一行(4 個 int)&a + 1 跳過整個 3x4 數組(12 個 int)&a 是行指標(int (*)[N]),+1 跨越整個數組。int* 後,+1/-1 以 sizeof(int) 為步長。*(p-1) 等價於 a[N-1],常用於獲取數組尾元素。&a + 1 指向的位置屬於「指向數組最後一個元素之後」的合法指標,可參與減法運算,但不可解參考。