題目:已定義 int w[3][5];,下列運算式哪個不能正確表示陣列元素?
(A) *(&w[0][0] + 1)
(B) *(*w + 3)
(C) *(*(w + 1))
(D) *(w + 1)[4]
[] 優先序 高於 *(解參考)。因此:
*(w + 1)[4] 等價於 *((w + 1)[4]) → *(w[4]) → 存取第 5 列首元素 → 越界(w 只有 3 列),錯誤。*(*(w + 1)) 等價於 *(*(w + 1)) → *(w[1]) → w[1][0] → 正確。*(&w[0][0] + 1) → w[0][1] 正確。*(*w + 3) → *(w[0] + 3) → w[0][3] 正確。int a[3][4], (*p)[4];
p = a;
// *(p + 2) 等價於 a[2][0]?錯。
// 正確:*(p + 2) 解參考指向第 3 列首元素的指標 → a[2](型別 int[4]),需再解參考一次才得元素。
// 選項 (B) *(a + 2)[0] → *((a + 2)[0]) → *(a[2]) → a[2][0] 正確。
[] 先於 * 結合。遇到*ptr[i]先看ptr[i]再看*;若要先解參考再取索引,必須加括號*(ptr + i)或(*ptr)[i]。
w[i][j] 下標語法,編譯器優化更好,可讀性最高。typedef int (*RowPtr)[5]; 簡化型別宣告。