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

C 語言二維陣列與指標關係深度解析:記憶體佈局與存取方式

     編輯:關於C語言

程式碼範例

#include <stdio.h>

void main() {
    int a[5][5];
    int i, j;

    // 初始化:每列填入列索引值
    for (i = 0; i < 5; i++)
        for (j = 0; j < 5; j++)
            a[i][j] = i;

    // 輸出驗證
    for (i = 0; i < 5; i++) {
        for (j = 0; j < 5; j++)
            printf("%d ", a[i][j]);
        printf("\n");
    }
}

輸出結果

0 0 0 0 0
1 1 1 1 1
2 2 2 2 2
3 3 3 3 3
4 4 4 4 4

記憶體佈局深度解析

二維陣列在記憶體中是連續儲存的

int a[5][5] 在記憶體中佔用 5 × 5 × sizeof(int) 位元組,按列主序排列:

位址遞增 →
a[0][0] a[0][1] a[0][2] a[0][3] a[0][4]  ← 第 0 列 (5 個 int)
a[1][0] a[1][1] a[1][2] a[1][3] a[1][4]  ← 第 1 列
a[2][0] a[2][1] a[2][2] a[2][3] a[2][4]  ← 第 2 列
a[3][0] a[3][1] a[3][2] a[3][3] a[3][4]  ← 第 3 列
a[4][0] a[4][1] a[4][2] a[4][3] a[4][4]  ← 第 4 列

陣列名稱的型別與含義

指標運算差異

int a[5][5];
int (*p)[5] = a;      // 指向列的指標
int *q = a[0];        // 指向 int 的指標

p + 1;  // 位址 + 5 * sizeof(int) (跳過一整列)
q + 1;  // 位址 + sizeof(int)     (跳過一個 int)

常見存取方式等價性

以下四種寫法完全等價:

  1. a[i][j] — 標準下標法
  2. *(*(a + i) + j) — 指標解參考法
  3. *(*a + i * 5 + j) — 一維展開法 (需知列長)
  4. (*(a + i))[j] — 列指標下標法

函式參數傳遞二維陣列

方法 1:指定列數 (最常用)

void func(int arr[][5], int rows);  // 列數必須指定
void func(int (*arr)[5], int rows); // 等價寫法

方法 2:動態配置 (指標陣列)

void func(int **arr, int rows, int cols);  // 不同記憶體佈局!

注意:int a[5][5] 不能直接傳給 int**,記憶體佈局不同!

方法 3:C99 變長陣列 (VLA)

void func(int rows, int cols, int arr[rows][cols]);

關鍵總結

  • 二維陣列記憶體連續,按列主序儲存
  • 陣列名 a 是「指向含 5 個 int 陣列的指標」
  • a[i] 相當於 *(a + i),型別轉為 int*
  • 函式參數必須指定列數,編譯器才能計算位移
  • int a[5][5] 與 int** 型別不相容
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
運算式型別含義位址值
aint (*)[5]指向第一列的指標&a[0]
a[0]int*第一列首元素位址&a[0][0]
&aint (*)[5][5]指向整個陣列的指標&a[0][0] (同值不同型別)