方括號 [] 優先序高於星號 *,導致 int* p[] 與 int (*p)[] 代表完全不同的型別。本文以優先序規則剖析,附動態二維陣列對應關係。
[]、()(函數呼叫)最高* 次之const 等)最低| 宣告 | 解讀順序 | 實際型別 | 俗稱 |
|---|---|---|---|
int* p[2] | p → [2] → * → int | int* [2]:含 2 個 int* 的陣列 | 指標陣列 / 列指標陣列 |
int (*p)[2] | p → * → [2] → int | int (*)[2]:指向「2 個 int 陣列」的指標 | 陣列指標 / 列指標 |
int* p[2];
int a[3] = {1,2,3};
int b[4] = {4,5,6,7};
p[0] = a; // 指向 a
p[1] = b; // 指向 b
// p[0][i] 存取 a[i], p[1][j] 存取 b[j]
等價動態配置:
int** arr = new int*[2];
arr[0] = new int[3];
arr[1] = new int[4];
int (*p)[2];
int b[3][2] = {{1,2},{3,4},{5,6}};
p = b; // p 指向第 0 列
// p[i][j] 等價 b[i][j],記憶體連續
動態配置連續矩陣:
int (*p)[2] = new int[3][2]; // C++11 支援
// 或
int* flat = new int[3*2];
int (*p)[2] = reinterpret_cast(flat);
指標陣列 int* p[2]:
p[0] → [1][2][3] (位址 0x1000)
p[1] → [4][5][6][7] (位址 0x2000,離散)
陣列指標 int (*p)[2]:
p → [1][2][3][4][5][6] (位址 0x1000 連續)
p[0] → [1][2]
p[1] → [3][4]
p[2] → [5][6]
int* p[] / int**int (*p)[N] / 一維展開 p[i*N + j]void func(int (*mat)[COLS], int rows)(列數須為常數)從變數名出發:先右後左,遇括號優先
int* p[2]:p → 右[2] → 左* → int = 陣列int (*p)[2]:p → 左* → 右[2] → int = 指標