int doses[] = {1, 3, 2, 1000};
printf("%d\n", doses[3]); // 1000
printf("%d\n", 3[doses]); // 1000
// 為什麼 *(3+doses) == 3[doses]?
C 標準規定:a[b] 等價於 *(a + b)。加法交換律 ⇒ a + b == b + a ⇒ *(a + b) == *(b + a) ⇒ b[a] == a[b]。
doses[3]
→ *(doses + 3) // 定義
→ *(3 + doses) // 指針加法交換律
→ 3[doses] // 定義反向應用
doses 退化為 int*,指向首元素地址。3 + doses 將整數 3 隱式轉換為偏移量,按 sizeof(int) 縮放 → 向後 3 個 int 位置。* 取得該位置的值。*(3+doses) == 3[doses] 純屬 C 語言**下標運算符定義**與**指針加法交換律**的必然結果。理解 a[b] ≡ *(a+b) 是掌握 C 指針的核心鑰匙。