int **a[3][4];
根據「聲明從右向左、就近結合」原則:
a 是標識符。[3][4] 最先結合 → a 是 **3行4列的二維數組**,共 12 個元素。** 次之 → 每個元素類型是 int **(指向指針的指針)。int 最後 → 基礎類型 int。結論:a 是 **元素類型為 int** 的二維數組**,而非指針。
sizeof(a) 計算sizeof(int**) = 4。sizeof(a) = 12 × 4 = **48 字節**。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** * | 指針大小 |
sizeof(a)、&a。其餘場合全部退化為指向首元素的指針。