指標宣告中的括號決定結合優先序,int(*p)[] 與 int(**p)[] 雖長相似,語意卻截然不同。本文以運算子優先序剖析型別結構,附矩陣操作實例。
| 宣告 | 優先序分析 | 語意 | 相容型別 |
|---|---|---|---|
int (*p)[10] | () 最高 → p 是指標 → 指向 int[10] | 指向「10 個 int 的陣列」的指標(列指標) | int arr[3][10] 的列:arr、arr+1 |
int (**p)[10] | () → *p 是指標 → 指向 int[10] 的指標 | 指向「列指標」的指標(指向列指標的指標) | &arr(其中 arr 為 int(*)[10]) |
int a[2][2] = {{1,2},{3,4}};
// 1. 列指標遍歷
int (*p)[2] = a; // p 指向第 0 列
for (int i = 0; i < 2; i++)
for (int j = 0; j < 2; j++)
cout << *(*(p+i) + j) << ' '; // *(p+i) 為第 i 列首址
// 2. 指向列指標的指標
int (**q)[2] = &p; // q 指向 p
for (int i = 0; i < 2; i++)
for (int j = 0; j < 2; j++)
cout << *(*(*q + i) + j) << ' '; // *q 即 p
a[2][2] 記憶體:[1][2][3][4] 連續分佈
p = a → p 指向 [1][2] 開頭
p+1 → 指向 [3][4] 開頭(跨越 2*sizeof(int))
q = &p → q 指向變數 p 本身
*q → 等價 p
int (*p)[N]:函數參數接收固定列數的二維陣列 void func(int (*mat)[N], int rows)int (**p)[N]:需修改呼叫端的列指標變數(如動態配置矩陣並回傳指標陣列)int(*)[N] 而非 int**,保持連續性例:int (**p)[10] → p → 是指標 → 指向 → 陣列 10 個 → int → 指標 → 指向 → int