設有整型二維陣列a[3][4]如下:
0 1 2 3
4 5 6 7
8 9 10 11
它的定義為:
int a[3][4]=,,}
設陣列a的首位址為1000,各下標變數的首位址及其值如圖所示。
前面介紹過,c語言允許把乙個二維陣列分解為多個一維陣列來處理。因此陣列a可分解為三個一維陣列,即a[0]、a[1]、a[2]。每乙個一維陣列又含有四個元素。
例如a[0]陣列,含有a[0][0],a[0][1],a[0][2],a[0][3]四個元素。
陣列及陣列元素的位址表示如下:從二維陣列的角度來看,a是二維陣列名,a代表整個二維陣列的首位址,也是二維陣列0行的首位址,等於1000。a+1代表第一行的首位址,等於1008。如圖:
a[0]是第乙個一維陣列的陣列名和首位址,因此也為1000。*(a+0)或*a是與a[0]等效的, 它表示一維陣列a[0]0 號元素的首位址,也為1000。&a[0][0]是二維陣列a的0行0列元素首位址,同樣是1000。因此,a,a[0],*(a+0),*a,&a[0][0]是相等的。
同理,a+1是二維陣列1行的首位址,等於1008。a[1]是第二個一維陣列的陣列名和首位址,因此也為1008。&a[1][0]是二維陣列a的1行0列元素位址,也是1008。因此a+1,a[1],*(a+1),&a[1][0]是等同的。
由此可得出:a+i,a[i],*(a+i),&a[i][0]是等同的。
此外,&a[i]和a[i]也是等同的。因為在二維陣列中不能把&a[i]理解為元素a[i]的位址,不存在元素a[i]。c語言規定,它是一種位址計算方法,表示陣列a第i行首位址。由此,我們得出:a[i],&a[i],*(a+i)和a+i也都是等同的。
另外,a[0]也可以看成是a[0]+0,是一維陣列a[0]的0號元素的首位址,而a[0]+1則是a[0]的1號元素首位址,由此可得出a[i]+j則是一維陣列a[i]的j號元素首位址,它等於&a[i][j]。
由a[i]=*(a+i)得a[i]+j=*(a+i)+j。由於*(a+i)+j是二維陣列a的i行j列元素的首位址,所以,該元素的值等於*(*(a+i)+j)。
【例10-22】
main();把二維陣列a分解為一維陣列a[0]、a[1]、a[2]之後,設p為指向二維陣列的指標變數。可定義為:printf
("%d,"
,a);
printf
("%d,"
,*a);
printf
("%d,"
,a[0
]);printf
("%d,"
,&a[
0]);
printf
("%d\n"
,&a[0][
0]);
printf
("%d,"
,a+1
);printf
("%d,"
,*(a+1
));printf
("%d,"
,a[1
]);printf
("%d,"
,&a[
1]);
printf
("%d\n"
,&a[1][
0]);
printf
("%d,"
,a+2
);printf
("%d,"
,*(a+2
));printf
("%d,"
,a[2
]);printf
("%d,"
,&a[
2]);
printf
("%d\n"
,&a[2][
0]);
printf
("%d,"
,a[1]+1
);printf
("%d\n"
,*(a+1)+1
);printf
("%d,%d\n"
,*(a[1]+
1),*(*(a+1)+1
));}
int (*p)[4]
它表示p是乙個指標變數,它指向包含4個元素的一維陣列。若指向第乙個一維陣列a[0],其值等於a,a[0],或&a[0][0]等。而p+i則指向一維陣列a[i]。從前面的分析可得出*(p+i)+j是二維陣列i行j 列的元素的位址,而*(*(p+i)+j)則是i行j列元素的值。
二維陣列指標變數說明的一般形式為:
型別說明符 (*指標變數名)[長度]
其中「型別說明符」為所指陣列的資料型別。「*」表示其後的變數是指標型別。「長度」表示二維陣列分解為多個一維陣列時,一維陣列的長度,也就是二維陣列的列數。應注意「(*指標變數名)」兩邊的括號不可少,如缺少括號則表示是指標陣列(本章後面介紹),意義就完全不同了。
【例10-23】
main();int(*p)[4];
int i,j;
p=a;
for(i=
0;i<
3;i++)
}
指向多維陣列的指標
為什麼指向多維陣列的指標要宣告除第一維外的所有下標大小呢?從編譯器的角度說是為了進行位址的運算 比如 你宣告了乙個int p,當你用p 1運算的時候,編譯器知道要給你的新位址加4 你宣告了乙個char p,當你用p 1運算的時候,編譯器知道要給你的新位址加1 同樣的道理,當你宣告了乙個指向多維陣列的...
1124C語言 指向多維陣列的指標和指標變數
總結一下今天所學的c語言 第一 如果有乙個實參陣列,想在函式中改變此陣列的元素的值,實參與形參的對應關係有以下 種 1 形參和實參都是陣列名。main 設陣列a的首位址為1000,各下標變數的首位址及其值如圖所示。我在前面已經學過 語言是允許把乙個二維陣列分解為多個一維陣列來處理,因此陣列 a可分解...
C語言基礎 指標陣列(指向陣列的指標)
陣列 array 是一系列具有相同型別的資料的集合,每乙份資料叫做乙個陣列元素 element 陣列中的所有元素在記憶體中是連續排列的,整個陣列占用的是一塊記憶體。定義陣列時,一定要給出陣列名,陣列名可以認為是乙個指標,它指向陣列的第 0 個元素。在c語言中,我們將第 0 個元素的位址稱為陣列的首位...