C 標準定義下標運算符 a[b] 等價於 *(a + b)。由於加法交換律,a + i ≡ i + a,故 a[i] ≡ i[a]。本文從標準定義、指針算術、內存地址模型三個維度徹底解釋這一「反直覺」特性。
a[b] ≡ *(a + b)
因此:
a[5] ≡ *(a + 5) 5[a] ≡ *(5 + a) ≡ *(a + 5) ≡ a[5]
a 是數組首元素地址(指針)。a + i 向後偏移 i * sizeof(*a) 字節。i + a 同理,指針與整數相加交換律成立。* 取該地址存儲的值。int a[10] = {9,2,3,4,7,6,5,8,1,10};
// 假設 a 首地址 0x1000,int 4 字節
// a[5] → 地址 0x1000 + 5*4 = 0x1014 → 值 6
// 5[a] → 地址 5 + 0x1000 = 0x1005? 不!編譯器按指針算術:5 + a → a + 5 → 同樣 0x1014 → 值 6
#includeint main() { int a[10] = {9,2,3,4,7,6,5,8,1,10}; printf("a[5] = %d\n", a[5]); // 6 printf("*(a+5) = %d\n", *(a+5)); // 6 printf("*(5+a) = %d\n", *(5+a)); // 6 printf("5[a] = %d\n", 5[a]); // 6 return 0; }
輸出四行全為 6,證明等價性。
i[a] 僅為語法糖副產物,降低可讀性,嚴禁生產代碼使用。a[i] == i[a] 直接源於 C 將下標運算定義為指針加法與解引用的組合,加法交換律導致二者等價。這體現了 C 語言「數組即指針」的核心設計哲學——看似靈活,實則要求程序員對內存模型有清晰認知。