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

C語言指針陣列與二維陣列的本質區別深度解析

     編輯:關於C

指針陣列與二維陣列在語法上相似,但記憶體佈局、存取方式、靈活度截然不同。本文從定義、記憶體模型、優缺點三個維度徹底釐清兩者區別。

定義對比

int a[10][20];   // 真正的二維陣列
int *b[10];      // 指針陣列(10個指針)

記憶體模型差異

二維陣列 a[10][20]

  • 連續分配 200 個 int 空間(10×20)
  • 記憶體佈局:a[0][0], a[0][1], ..., a[0][19], a[1][0], ...
  • 存取公式:a[i][j] ≡ *(*(a + i) + j),編譯器自動計算偏移
  • sizeof(a) = 200 * sizeof(int)

指針陣列 b[10]

  • 僅分配 10 個指針空間(10 * sizeof(int*))
  • 各指針未初始化,需顯式指向有效記憶體
  • 每行長度可不同(鋸齒陣列)
  • 總空間 = 指針陣列 + 各行實際分配之和

圖示記憶體佈局

二維陣列 a[3][4]:           指針陣列 b[3](每行長度不同):
┌─────────────────────┐      ┌─────────┐
│ a[0][0] a[0][1] ... │      │ b[0] ───┼──► ┌──┬──┬──┐
│ a[1][0] a[1][1] ... │      │ b[1] ───┼──► ┌──┬──┬──┬──┐
│ a[2][0] a[2][1] ... │      │ b[2] ───┼──► ┌──┬──┐
└─────────────────────┘      └─────────┘
連續記憶體塊               分散的記憶體塊

初始化範例

// 二維陣列靜態初始化
int a[2][3] = {{1,2,3}, {4,5,6}};

// 指針陣列初始化(需先有行資料)
int row0[] = {1,2,3};
int row1[] = {4,5};
int *b[2] = {row0, row1};  // 第二行只有2個元素

核心差異總結表

特性二維陣列指針陣列
記憶體連續性完全連續行間不連續
行長度固定可變(鋸齒)
分配時機編譯期/棧上執行期/堆上
sizeof 結果總大小僅指針陣列大小
參數傳遞退化為指針傳遞指針陣列
釋放管理自動需手動逐行 free

函數參數傳遞差異

// 二維陣列:必須指定列數
void func_arr(int arr[][20], int rows);

// 指針陣列:雙重指針
void func_ptr(int **arr, int rows);

選擇建議

  • 固定尺寸矩陣、效能敏感 → 二維陣列(緩存友好、連續存取)
  • 行長度不一、動態分配、需頻繁增刪行 → 指針陣列
  • 需傳遞給不定行數的函數 → 指針陣列更靈活
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved