[例106]分析程序的輸出結果,熟悉二維數組元素的表示方法。
voidmain()
{
inta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12},i,j;
i=1;
j=2;
printf("a[%d][%d]=%d\n",i,j,a[i][j]);
printf("*(*(a+%d)+%d)=%d\n",i,j,*(*(a+i)+j));
printf("*(a[%d]+%d)=%d\n",i,j,*(a[i]+j));
printf("(*(a+%d))[%d]=%d\n",i,j,(*(a+i))[j]);
printf("*(a[0]+4*%d+%d)=%d\n",i,j,*(a[0]+4*i+j));
}
程序輸出結果為:
a[1][2]=7
*(*(a+1)+2)=7
*(a[1]+2)=7
(*(a+1))[2]=7
*(a[0]+4*1+2)=7
程序分析:
(1)從程序結果可以看出,這五種引用二維數組元素的方法是等價的。
(2)當i為0、j也為0時,*(*(a+i)+j)就變為*(*a),即**a。
2.指向二維數組元素的指針變量
二維數組有兩種不同類型的指針,所以我們要定義兩種不同類型的指針變量來存放相應指針。
(1)指向二維數組元素的指針變量
定義指向二維數組元素的指針變量與以前介紹的定義一個指向變量的指針變量相同,但必須注意的是,基類型必須與數組的數據類型一致。例如:
inta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
int*pa;/*數組為int型,則指針變量也應指向int型*/
這裏定義的指針變量pa可以指向數組a的任何一個元素,隻要把該元素的指針賦給它就可以了,請看下麵的實例:
pa=&a[0][0];/*等價於pa=a[0];或pa=*a;*/
pa=&a[2][3];/*等價於pa=a[2]+3;或pa=*(a+2)+3;*/
第一條語句是使指針變量pa指向數組的元素a[0][0],第二條語句是使指針變量pa指向數組的元素a[2][3]。這裏很容易發生這樣的錯誤:
pa=a;
顯然,指針類型不一致,a是行指針,而指針變量pa是指向數組元素的指針變量。
[例107]用指針變量輸出數組元素的值。
voidmain()
{
inta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
int*pa;
for(pa=a[0];pa