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

C/C++ 二維陣列指標完整解析:行指標、列指標、遞減轉換與地址等價關係

     編輯:關於C語言

核心概念:行指標 vs 列指標

  • 二維陣列名 a:指向**第一行**的行指標,型別 int (*)[COLS]。
  • 一維陣列名 a[0], a[1]:指向**第一列元素**的列指標,型別 int*。

關鍵轉換規則

地址等價關係(重點)

以下表達式**數值相等**(地址相同),但**型別不同**:

a + i
a[i]
*(a + i)
&a[i]
&a[i][0]

型別差異決定指標運算步長:

  • 行指標 +1 → 跨越一整行(COLS * sizeof(int) 位元組)。
  • 列指標 +1 → 跨越一個元素(sizeof(int) 位元組)。

完整對照表(假設 int a[3][4])

運算結果型別語意
a / a+i行指標 int (*)[COLS]指向第 i 行首地址
*a / *(a+i) / a[i]列指標 int*指向第 i 行首元素(列指標)
**a / *a[i] / *(*(a+i)+j)int元素值 a[i][j]
&a[i] / &a[i][0]行指標 int (*)[COLS]第 i 行首地址
表達式型別代表意義地址值
aint (*)[4]第 0 行首地址基址
*aint*a[0][0] 地址基址
a[0]int*a[0][0] 地址基址
&a[0]int (*)[4]第 0 行首地址基址
a+1int (*)[4]第 1 行首地址基址 + 16
a[1]int*a[1][0] 地址基址 + 16
*a+1int*a[0][1] 地址基址 + 4
*(a+1)int*a[1][0] 地址基址 + 16
&a[1]int (*)[4]第 1 行首地址基址 + 16
a[1][0]int元素值—

函數參數傳遞二維陣列

// 1. 指定列數(行數可變)
void func(int a[][4], int rows);

// 2. 行指標
void func(int (*a)[4], int rows);

// 3. 一維陣列模擬(手動計算索引)
void func(int* a, int rows, int cols); // a[i*cols + j]

常見錯誤

  • int** p = a; **錯誤**!a 是行指標 int (*)[4],非 int**。
  • 混淆 *a+1(列指標+1)與 *(a+1)(行指標+1 再解引用)。
  • sizeof(a) 在陣列定義處為整個陣列大小,傳入函數退化為指標後為指標大小。

總結

二維陣列名本質是**行指標**。掌握 *(行→列)、&(列→行)的型別轉換,以及**地址數值相同但型別決定步長**的核心原理,即可靈活操作二維陣列指標。

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