首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C語言指向陣列的指標:二維陣列操作的核心鑰匙

     編輯:關於C語言

前言:指標與陣列的微妙關係

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 行首地址arrint (*)[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]
}

關鍵限制:次維度(列數)必須在編譯期已知,否則編譯器無法計算行步長。

五、動態配置二維陣列:指標陣列 vs 連續記憶體

方法 1:指標陣列(行分散)


int **matrix = malloc(rows * sizeof(int*));
for (int i = 0; i < rows; ++i)
    matrix[i] = malloc(cols * sizeof(int));
// 釋放需逐行 free

方法 2:連續記憶體(單一 malloc,效能優)


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 語言二維陣列操作的「正規軍」:型別攜帶行長度資訊,指標運算自動匹配記憶體佈局,函數參數完美適配。掌握其宣告、解參考、行遍歷三大模式,配合連續記憶體配置策略,能寫出高效、可維護的矩陣運算、影像處理、表格運算代碼。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved