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

C語言指針進階解析:陣列指針、指針陣列、二級指針與二維陣列遍歷實例

     編輯:關於C語言

C語言指針進階解析:陣列指針、指針陣列、二級指針與二維陣列遍歷實例

通過 7 個經典例題,理清指針類型、解引用層級、陣列退化與內存佈局。

例 1:陣列指針與取址

int a[5]={1,2,3,4,5};
int *p = (int*)(&a + 1);
printf("%d", *(p-1)); // 5

// &a 類型 int(*)[5],+1 跳過整個陣列 (20字節)
// 強轉 int* 後 p 指向 a[5] (越界),p-1 回到 a[4] = 5

例 2:指針陣列與二級指針

int a[]={1,2,3,4,5};
int *p[]={a, a+1, a+2, a+3};
int **q = p;
printf("%d", *(p[0]+1) + **(q+2)); // 2 + 3 = 5

// p[0]=a, p[0]+1=a+1 → * = 2
// q+2 = &p[2] → *(q+2)=p[2]=a+2 → **(q+2)=*(a+2)=3

例 3:二維陣列行指針

int a[3][4]={1..12};
int (*pt)[4] = a;
printf("%d", (*(pt+2))[2]); // 11

// pt 指向行,pt+2 指向第3行 (a[2])
// (*(pt+2))[2] 即 a[2][2] = 11

例 4:指針陣列指向二維陣列行

int a[3][2]={1,2,3,4,5};
int *p[3];
p[0] = a[1];
printf("%d", *(p[0]+1)); // a[1][1] = 4

例 5:靜態陣列與指針陣列

static int a[]={5,4,3,2,1};
int *p[]={a+3,a+2,a+1,a};
int **q=p;
printf("%d", *(p[0]+1) + **(q+2)); // a[4] + a[1] = 1+4=5

例 6:指針算術與下標等價

int a[10]={1..10};
int *p = &a[3];
int b = p[5]; // 9
// p[5] = *(p+5) = *(&a[3]+5) = a[8] = 9

例 7:二維陣列扁平化訪問

int a[2][3]={1..6};
int *p = a[0];
printf("%d", *(p+3)); // a[1][0] = 4
// 內存連續:a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2]
// p+3 跨過第一行 3 個元素,落在第二行首元素

核心口訣

  • int *p[3] — 指針陣列 (3 個 int*)。
  • int (*p)[3] — 陣列指針 (指向含 3 元素的 int 陣列)。
  • 二維陣列名 a 在表達式中退化為 int (*)[COLS] (行指針)。
  • 指針運算步長由**基類型**決定:int* 步長 4,int(*)[4] 步長 16。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved