| 名稱 | 宣告 | 本質 | 指向 |
|---|---|---|---|
| 指標陣列 | int *p[N]; | 陣列,元素是指標 | N 個獨立的一維陣列/變量 |
| 陣列指標 | int (*p)[N]; | 指標,指向一個陣列 | 一個包含 N 元素的一維陣列(常用於二維陣列行) |
口訣:[] 優先級高於 *,int *p[N] → int *(p[N]);int (*p)[N] 括號提升 * 優先級。
static int m[3][4] = {
0, 1, 2, 3,
4, 5, 6, 7,
8, 9, 10, 11
};
int (*p)[4]; // 指向 4-int 陣列的指標
p = m; // m 首行地址,類型匹配
// 方式 A:下標法
for (int i=0; i<3; ++i)
for (int j=0; j<4; ++j)
printf("%d ", p[i][j]); // 或 *(p[i]+j), *(*(p+i)+j)
// 方式 B:指標遞增
for (int i=0; i<3; ++i, ++p) {
printf("%d %d %d %d\n", **p, *(*p+1), *(*p+2), *(*p+3));
}
int *q[3]; // 3 個 int 指標
for (int i=0; i<3; ++i) q[i] = m[i]; // 每行首地址
for (int i=0; i<3; ++i)
for (int j=0; j<4; ++j)
printf("%d ", q[i][j]); // 或 *(q[i]+j)
// 扁平化訪問
q[0] = m[0];
for (int i=0; i<3; ++i)
for (int j=0; j<4; ++j)
printf("%d ", *(q[0] + j + 4*i));
m (3 行 × 4 列) 連續佈局: Row 0: 0 1 2 3 ← m[0], p, q[0] Row 1: 4 5 6 7 ← m[1], q[1] Row 2: 8 9 10 11 ← m[2], q[2] 陣列指標 p:單一指標,+1 跨越整行(4×sizeof(int)) 指標陣列 q:3 個獨立指標,各指向行首 扁平化:q[0] 指向第 0 行首,+4*i 跳行
| 特性 | 陣列指標 int (*p)[4] | 指標陣列 int *q[3] |
|---|---|---|
| 類型 | 指向「4-int 陣列」的指標 | 「int 指標」的陣列 |
| sizeof(p) | 指標大小(4/8B) | 陣列大小(3×指標大小) |
| p+1 偏移 | 1 行(16B) | 1 指標槽(4/8B) |
| 適用場景 | 函數參數傳二維陣列、行遍歷 | 不規則/鋸齒陣列、多源頭行指標 |
| 初始化 | p = m; | 逐行 q[i] = m[i]; |
// 傳固定列數二維陣列
void process(int (*arr)[4], int rows) { ... }
void process(int arr[][4], int rows) { ... } // 等價
// 傳不規則陣列
void process(int **arr, int rows) { ... } // 需指標陣列
「陣列指標」是單一指標,步長為整行;「指標陣列」是指標集合,步長為單指標。二維陣列行連續時首選陣列指標,靈活性需求選指標陣列。搞清類型與步長,指標操作不再迷茫。