C語言指向多維陣列的指標

2021-06-21 06:12:11 字數 2529 閱讀 4127

設有整型二維陣列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();

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

));}

把二維陣列a分解為一維陣列a[0]、a[1]、a[2]之後,設p為指向二維陣列的指標變數。可定義為:

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 個元素的位址稱為陣列的首位...