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

C 語言指針數組、數組指針、二維數組與數組名深度解析

     編輯:C++ 入門

C 語言指針數組、數組指針、二維數組與數組名深度解析

指針與數組是 C 語言核心也是難點。本文通過類比、圖解、代碼驗證,系統梳理數組名、指針數組、數組指針、二維數組的本質區別與使用技巧。

1. 數組名

int a[3] = {1,2,3};
  • a:首元素地址,等價 &a[0],類型 int*。a+1 偏移 sizeof(int)。
  • &a:整個數組地址,類型 int(*)[3]。&a+1 偏移 sizeof(int[3]) = 12 字節。
  • 區別:值相同,但類型不同,指針運算步長不同。int *p = a; 合法;int (*p)[3] = &a; 合法;int *p = &a; 類型不匹配。

2. 指針數組

定義:int *ptr[3]; — 數組,元素是 int*。

int x=5; ptr[0]=&x; ptr[1]=&a[2];
*ptr[0] → 5; *ptr[1] → 3;

理解口訣:先看 [],說明是數組;再看元素類型 int*。

3. 數組指針

定義:int (*ptr)[3]; — 指針,指向 int[3] 類型數組。

int (*ptr)[3] = &a; // 正確
(*ptr)[0] → 1; // 先解引用得數組,再取下標

類比:int *p = &x; *p → 5。數組指針同理:*ptr 得到數組,(*ptr)[i] 取元素。

4. 二維數組

本質:一維數組的數組,元素類型為 int[3]。

int a[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
  • a:首行地址,類型 int(*)[3],等價 &a[0]。a+1 指向第二行,偏移 12 字節。
  • &a:整個二維數組地址,類型 int(*)[3][3],偏移 36 字節。
  • 數組指針遍歷:int (*ptr)[3] = a; // 正確,a 為首行地址。ptr[i][j] 等價 *(*(ptr+i)+j)。

5. 經典等價關係

表達式含義類型
a首行地址int(*)[3]
a[0]首行首元素地址int*
&a[0][0]首元素地址int*
a+1第二行地址int(*)[3]
*(a+1)第二行首元素地址int*
*(*(a+1)+2)a[1][2] 值int

6. 常見面試題解析

  1. *(a+1) 與 a+1 地址相同? 二維數組中,a+1 是第二行地址(行指針),*(a+1) 解引用得第二行首元素地址(列指針),數值相同但類型不同。
  2. a[0] 與 *(a+0) 等價? 都是首行首元素地址,類型均為 int*。

7. 總結口訣

  1. 數組名 = 首元素地址(&a[0]),非數組地址(&a 除外)。
  2. &a = 數組整體地址,步長 = 整個數組大小。
  3. 指針數組 = 存指針的數組,int *p[N]。
  4. 數組指針 = 指向數組的指針,int (*p)[N]。
  5. 二維數組 = 元素為一維數組的一維數組。

理解指針與數組的關鍵在於「類型決定步長」。畫內存圖、寫測試代碼驗證 sizeof 和地址差值,是掌握的最快途徑。

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