以上定義涉及兩個運算符:“*”(間接引用)、“[]”(下標),“[]”的優先級別大於“*”的優先級別。
首先看int *p[4],“[]”的優先級別高,所以它首先是個大小為4的數組,即p[4];剩下的“int *”作為補充說明,即說明該數組的每一個元素為指向一個整型類型的指針。int *p[4]的存儲結構如下:(存儲方格橫向排列或豎向排列沒區別,只要按內存地址順序排列就行,此處只是為畫圖方便)
再看int (*q)[4]。它首先是個指針,即*q,剩下的“int [4]”作為補充說明,即說明指針q指向一個長度為4的數組。int (*q)[4]的存儲結構如下:
請看以下定義:
int a[2][4]={{2,5,6,8},{22,55,66,88}};
int c[4]={5,8,9,4};
int d[3]={23,12,443};
int *p[4],(*q)[4];
q=a;
*p=c;
*(p+1)=d;
則int *p[4]和int (*q)[4]的存儲數據為:
驗證:
#include <stdio.h> int main(void) { int a[2][4]={{2,5,6,8},{22,55,66,88}}; int c[4]={5,8,9,4}; int d[3]={23,12,443}; int *p[4],(*q)[4]; q=a; *p=c; *(p+1)=d; int i,j; for(i=0;i<2;i++) for(j=0;j<4;j++) { if((i==1)&&(j==3)) break; printf("*(*(p+%d)+%d)=%d\n",i,j,*(*(p+i)+j)); } puts("==============="); for(i=0;i<2;i++) for(j=0;j<4;j++) printf("*(*(q+%d)+%d)=%d\n",i,j,*(*(q+i)+j)); return 0; }
輸出結果為: *(*(p+0)+0)=5 *(*(p+0)+1)=8 *(*(p+0)+2)=9 *(*(p+0)+3)=4 *(*(p+1)+0)=23 *(*(p+1)+1)=12 *(*(p+1)+2)=443 =============== *(*(q+0)+0)=2 *(*(q+0)+1)=5 *(*(q+0)+2)=6 *(*(q+0)+3)=8 *(*(q+1)+0)=22 *(*(q+1)+1)=55 *(*(q+1)+2)=66 *(*(q+1)+3)=88 |