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

指標陣列 vs 陣列指標:二維陣列訪問的兩種核心模式(附圖解代碼)

     編輯:關於C語言

核心定義

名稱宣告本質指向
指標陣列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
};

1. 陣列指標遍歷(行指標)

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));
}

2. 指標陣列遍歷

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) { ... }     // 需指標陣列

總結

「陣列指標」是單一指標,步長為整行;「指標陣列」是指標集合,步長為單指標。二維陣列行連續時首選陣列指標,靈活性需求選指標陣列。搞清類型與步長,指標操作不再迷茫。

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