首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

int **a[3][4] 與 sizeof(a) 及 int (**)a[3][4] 類型解析

     編輯:關於C語言

聲明解析

int **a[3][4];

根據「聲明從右向左、就近結合」原則:

  1. a 是標識符。
  2. [3][4] 最先結合 → a 是 **3行4列的二維數組**,共 12 個元素。
  3. ** 次之 → 每個元素類型是 int **(指向指針的指針)。
  4. int 最後 → 基礎類型 int。

結論:a 是 **元素類型為 int** 的二維數組**,而非指針。

sizeof(a) 計算

  • 32 位系統:指針佔 4 字節 → sizeof(int**) = 4。
  • 數組元素個數 = 3 × 4 = 12。
  • sizeof(a) = 12 × 4 = **48 字節**。
  • 64 位系統:指針佔 8 字節 → **96 字節**。

作為函數參數時的退化

void fun(int **a, int row, int col);
  • 數組名作參數**退化為指向首元素的指針**:類型變為 int***(指向 int** 的指針)。
  • 函數內 sizeof(a) = 指針大小 = **4 或 8 字節**,不再是數組總大小。
  • 需額外傳遞行列數,否則無法訪問後續元素。

int (**)a[3][4] 含義

此寫法**語法錯誤**。正確的指向二維數組的指針聲明:

int (*p)[3][4] = &a; // p 類型 int(*)[3][4],指向整個 3x4 數組
  • () 提升優先級,使 *p 先結合 → p 是指針。
  • [3][4] 修飾 *p 指向的類型。

數組名雙重含義速查

表達式含義類型sizeof 結果
a (單獨)數組首地址(右值)int** (*)[4] (指向行的指針)整個數組大小 (48)
sizeof(a)數組對象本身int** [3][4]48
&a整個數組地址int** (*)[3][4]指針大小 (4/8)
*a第一行 (退化為指向首元素指針)int** * (即 int***)指針大小
a[0]第一行數組 (退化)int** *指針大小

核心口訣

  1. 數組名只有兩種情況代表數組本身:sizeof(a)、&a。其餘場合全部退化為指向首元素的指針。
  2. sizeof 數組名 = 數組總字節數;sizeof 指針 = 指針字節數。
  3. 函數參數退化不可逆:進入函數即失去長度信息,必須額外傳長度。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved