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

C 語言數組訪問的五種等價形式與二維數組指針算術詳解

     編輯:關於C語言

C 語言數組訪問的五種等價形式與二維數組指針算術詳解

數組名、指針變量、下標運算、指針運算在 C 中有著緊密的等價關係。本文通過代碼演示一維數組的五種訪問寫法、二維數組地址計算規則,幫助建立「數組即指針、指針即數組」的直觀心智模型。

一維數組五種訪問方式

int array[6] = {1,2,3,4,5,6};
int *p = array;

// 1. 數組名 + 下標
for(i=0;i<6;i++) printf("%d ", array[i]);

// 2. 數組名 + 指針運算
for(i=0;i<6;i++) printf("%d ", *(array+i));

// 3. 指針變量 + 下標
for(i=0;i<6;i++) printf("%d ", p[i]);

// 4. 指針變量 + 指針運算
for(i=0;i<6;i++) printf("%d ", *(p+i));

// 5. 指針遞增(最高效,無乘法/加法開銷)
while(p < array+6) printf("%d ", *p++);

前四種編譯後機器碼幾乎相同;第五種省去索引計算,適合極度效能敏感場景。

二維數組地址解析

int b[3][5] = {{31,32,33,24,25},{16,17,8,9,10},{19,11,51,14,15}};
// b       : 首行首元素地址(int (*)[5])
// b+1     : 第二行首元素地址,跨越 5*sizeof(int) 字節
// b[0]    : 同 b,類型 int*
// b[0]+1  : 第一行第二個元素
// b[1]    : 第二行首元素,等價 *(b+1)
// &b[1][0]: 同 b[1]
// b[2][4] : 第三行第五個元素,等價 *(*(b+2)+4)

關鍵結論

  • array[i] 編譯器自動轉為 *(array+i),本質是指針運算。
  • 二維數組在內存中**按行連續存儲**,b[row][col] 偏移量 = (row * COLS + col) * sizeof(int)。
  • b 類型為 int (*)[5](指向含 5 個 int 的數組的指針),b+1 步長為整行大小。
  • 函數參數傳遞二維數組時,必須指定列數:void func(int arr[][5]) 或 void func(int (*arr)[5])。

掌握這些等價關係,能輕鬆閱讀、編寫高效的指針代碼,避免「指針與數組混淆」導致的緩衝區溢出、訪問越界等經典錯誤。

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