首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C 語言二維陣列指標運算式優先序陷阱:*(W+1)[4] vs *(*(W+1))

     編輯:程式設計綜合問答

題目:已定義 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]; 簡化型別宣告。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved