int *p 指向單一 int;int (*p)[3] 指向「包含 3 個 int 的陣列」。後者是操作二維陣列的關鍵——它的指標運算步長為整行大小,而非單一元素。
int arr[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
int (*p)[4] = arr; // p 指向第一行(含 4 個 int 的陣列)
記憶體佈局(行優先):
Row 0: 1 2 3 4 ← p+0 (base) Row 1: 5 6 7 8 ← p+1 (base + 4*sizeof(int)) Row 2: 9 10 11 12 ← p+2 (base + 8*sizeof(int))
| 運算式 | 指向位置 | 等價寫法 | 型別 |
|---|---|---|---|
p | 第 0 行首地址 | arr | int (*)[4] |
p + 1 | 第 1 行首地址 | &arr[1] | int (*)[4] |
p + i | 第 i 行首地址 | &arr[i] | int (*)[4] |
*p | 第 0 行陣列(退化為 int*) | arr[0] | int* |
*(p + i) | 第 i 行陣列 | arr[i] | int* |
*p + j / *(*p + j) | 第 0 行第 j 元素 | &arr[0][j] / arr[0][j] | int* / int |
*(p + i) + j / *(*(p + i) + j) | 第 i 行第 j 元素地址/值 | &arr[i][j] / arr[i][j] | int* / int |
#include
int main(void) {
int a[3][4] = {
{1, 3, 5, 7},
{9, 11, 13, 15},
{17, 19, 21, 23}
};
int (*b)[4]; // 指向 4-int 陣列的指標
// 1. 從第 1 行開始,每次跳 2 個元素列印
b = a + 1; // 指向第 1 行
for (int i = 1; i <= 4; ++i) {
printf("%d\t", *b[0]); // b[0] 等價 *(b+0) → 第 1 行首元素
b = (int (*)[4])((char*)b + 2*sizeof(int)); // 手動移動 2 個 int(教學示範,實務用 b++)
}
puts("");
// 2. 正規行遍歷
for (int i = 0; i < 2; ++i) {
b = a + i; // 指向第 i 行
printf("%d\t", *(b[i] + 1)); // 列印第 i 行第 1 個元素
}
puts("");
return 0;
}
輸出:
9 13 17 21 3 11 19
C 語言函數參數無法直接接收二維陣列,必須用指向陣列的指標:
// 正確:指定次維度
void printMatrix(int (*mat)[4], int rows) {
for (int r = 0; r < rows; ++r)
for (int c = 0; c < 4; ++c)
printf("%d ", mat[r][c]);
}
// 等價寫法(第一維度可省略)
void printMatrix(int mat[][4], int rows); // 編譯器視為 int (*)[4]
int main() {
int a[3][4] = {{...}};
printMatrix(a, 3); // a 退化為 int (*)[4]
}
關鍵限制:次維度(列數)必須在編譯期已知,否則編譯器無法計算行步長。
int **matrix = malloc(rows * sizeof(int*));
for (int i = 0; i < rows; ++i)
matrix[i] = malloc(cols * sizeof(int));
// 釋放需逐行 free
int (*matrix)[cols] = malloc(rows * sizeof *matrix);
// 或
int *flat = malloc(rows * cols * sizeof(int));
// 存取:flat[r*cols + c]
// 釋放:單一 free
int *p[4] 寫成 int (*p)[4] → 指標陣列 vs 指向陣列指標p+1 跳過整行,非單一元素void f(int a[][]) 編譯錯誤int (*p)[N] 是 C 語言二維陣列操作的「正規軍」:型別攜帶行長度資訊,指標運算自動匹配記憶體佈局,函數參數完美適配。掌握其宣告、解參考、行遍歷三大模式,配合連續記憶體配置策略,能寫出高效、可維護的矩陣運算、影像處理、表格運算代碼。