通過 7 個經典例題,理清指針類型、解引用層級、陣列退化與內存佈局。
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
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
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
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
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
int a[10]={1..10};
int *p = &a[3];
int b = p[5]; // 9
// p[5] = *(p+5) = *(&a[3]+5) = a[8] = 9
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。