首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C 語言二維數組指針遍歷:行指針 vs 元素指針的區別

     編輯:程式設計綜合問答

錯誤代碼

int a[2][2] = {2,6,1,9};
int *p;
for (p = a; p < a+4; p++)  // 錯誤:a 是行指針,a+4 越界
    printf("%d\n", *p);

正確代碼

int a[2][2] = {2,6,1,9};
int *p = a;  // p 指向首元素 a[0][0]
for (int i = 0; i < 4; i++)
    printf("%d\n", *(p + i));  // p+i 逐元素偏移

核心原理圖解

表達式類型+1 的含義示例值
aint (*)[2] 行指針跳過一整行(2 個 int)a+1 == &a[1][0]
p (int*)int* 元素指針跳過一個 intp+1 == &a[0][1]

錯誤原因

  • a 是指向「含 2 個 int 的數組」的指針,a+4 指向第 4 行(即 &a[4][0]),但數組只有 2 行 → **越界訪問**,行為未定義。
  • p = a 發生隱式轉換:行指針轉為元素指針,指向首元素,隨後 p+i 正確遍歷所有 4 個元素。

通用遍歷模板

// 方法一:元素指針(推薦)
int *p = &a[0][0];
for (int i = 0; i < rows * cols; i++) use(*(p+i));

// 方法二:雙重循環(最清晰)
for (int i = 0; i < rows; i++)
  for (int j = 0; j < cols; j++)
    use(a[i][j]);

// 方法三:行指針
int (*prow)[cols] = a;
for (int i = 0; i < rows; i++)
  for (int j = 0; j < cols; j++)
    use(prow[i][j]);

記住:**二維數組名是行指針,步長為行大小;轉為元素指針後步長為元素大小。**

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