宣告語法:括號決定結合優先序
int (*p)[3]; /* p 是「指向 3 個 int 陣列」的指標 */
int *p[3]; /* p 是「3 個指向 int 的指標」陣列 (指標陣列) */
/* 差異在於 () 強制 * 優先於 [] 結合 */
指標算術:步長 = 陣列總大小
int (*p)[3]; → sizeof(*p) = 3 * sizeof(int) = 6 bytes (16-bit 環境)。
p + 1 位址遞增 6 bytes,指向下一個「3-int 陣列」。
- 對比:
int *q; → q + 1 遞增 2 bytes (單一 int)。
處理二維陣列的實戰優勢
int a[3][4];
int (*p)[4] = a; /* p 指向「4-int 陣列」,完美匹配 a 的列型別 */
p = a + 1; /* p 指向第 1 列 */
*p[0] 或 **p /* 存取 a[1][0] */
*p[0] + 2 /* 存取 a[1][2] */
*(p + i) + j /* 存取 a[i][j] */
完整範例:靈活走訪二維陣列
int a[3][4] = {
{1, 3, 5, 7},
{9, 11, 13, 15},
{17, 19, 21, 23}
};
int main(void)
{
int i, (*b)[4];
b = a + 1; /* b 指向第 1 列 */
for (i = 1; i <= 4; b = b[0] + 2, ++i) /* 每次跳 2 元素 */
printf("%d\t", *b[0]); /* 輸出 9, 13, 17, 21 */
printf("\n");
for (i = 0; i < 2; ++i) {
b = a + i; /* 每次跳 1 列 */
printf("%d\t", *(b[i] + 1)); /* 輸出 a[0][1]=3, a[1][1]=11 */
}
printf("\n");
return 0;
}
/* 輸出:
9 13 17 21
3 11 19
*/
關鍵差異總結
| 宣告 | 名稱 | +1 步長 | 典型用途 |
int *p; | 指向 int 的指標 | sizeof(int) | 一般指標、字串、動態陣列 |
int (*p)[N]; | 指向 N-int 陣列的指標 | N * sizeof(int) | 二維陣列列指標、矩陣運算 |
int *p[N]; | N 個 int 指標的陣列 | sizeof(int*) | 指標陣列、不規則二維陣列 |
現代 C 實務
- 固定行數二維陣列:優先用
int (*p)[COLS],型別安全、指標算術直覺。
- 動態行數:用扁平化
int *p = malloc(rows * COLS * sizeof(int)); + 封裝巨集 AT(p, r, c)。
- C++:
std::vector> 或 std::mdspan (C++23)。