二維陣列與指標

2021-07-13 23:07:13 字數 2642 閱讀 7444

1、二維陣列和陣列元素的位址若有以下定義:int *p, a[3][4];

注意此處的int,定義為2位元組長度大小

1)二維陣列a由若干個一維陣列組成,在c語言

中定義的二維陣列實際上是乙個一維陣列,這個一維陣列的每乙個成員又是乙個一維陣列。如以上定義的a陣列,則可視a陣列由a[0]、a[1]、a[2]等三個元素組成,而a[0]、a[1]、a[2]等每個元素又分別是由4個整型元素組成的一維陣列。可用a[0][0]、a[0][1]等來引用a[0]中的每個元素,其它依次類推。在第二節中已解釋過,c語言中,在函式體中或在函式外部定義的一維陣列名是乙個位址常量,其值為陣列第乙個元素的位址,此位址的基型別就是陣列元素的型別。在以上二維陣列中,a[0]、a[1]、a[2]都是一維陣列名,同樣也代表乙個不可變的位址變數,其值依次為二維陣列每行第乙個元素的位址,其基型別就是陣列元素的型別。因此,對於二維陣列,象a[0]++這樣的表示式是非法的。若有表示式a[0]+1,表示式中1的單位應當是2個位元組。在以上定義中,指標變數p的基型別與a[i](0≤i<3)相同,因此,賦值語句p=a[i];是合法的。我們已知a[i]也可以寫成:*(a+i),故以上賦值語句也可寫成:p=*(a+i);。

2)二維陣列名也是乙個位址常量二維陣列名同樣也是乙個存放位址常量的指標,其值為二維陣列中第乙個元素的位址。以上a陣列,陣列名a的值與a[0]的值相同,只是其基型別為具有4個整型元素的陣列型別。即a+0的值與a[0]的值相同,a+1的值與a[1]的值相同,a+2的值與a[2]的值相同,它們分別表示a陣列中第零、第

一、第二行的首位址。二維陣列名應理解為乙個行指標。在表示式a+1中,數值1的單位應是4×2個位元組,而不是2個位元組。賦值語句p=a;是不合法的,因為p和a的基型別不同。同樣,對於二維陣列名a,也不可以進行a++,a=a+i等運算。

在以上表示式中a[i]、&a[0][0]、a[0]的基型別都是int型別,系統將自動據此來確定表示式中常量1的單位是2個位元組。但是不可以把求a[i][j]位址的表示式寫成:a+4*i+j,因為a的基型別是4個整型元素的陣列型別,系統將自動據此來確定常量1的單位是8個位元組。

2、通過位址來引用二維陣列元素若有以下定義:int a[3][4],i,j;且當0≤i<3、0≤j<4,則a陣列元素可用以下五種表示式來引用:(1)a[i][j](2)*(a[i]+j)(3)*(*(a+i)+j)(4)(*(a+i))[j](5)*(&a[0][0]+4*i+j)

在(2)中,表示式*(a[i]+j)中,因為a[i]的基型別為int,j的位移量為2×j位元組。

在(3)中,表示式*(*(a+i)+j)中,a的基型別為4個元素的陣列,i的位移量為4×2×i位元組;而*(a+i)的基型別為int,j的位移量仍為2×j位元組。

在(4)中,*(a+i)外的一對圓括號不可少,若寫成:*(a+i)[j],因為運算子的優先順序高於*號,表示式可轉換成:*(*(a+i)+j)),即為:*(*(a+i+j)),這時i+j將使得位移量為4×2×(i+j)個位元組,顯示然這已不是元素a[i][j]的位址。*(*(a+i+j))等價於*(a[i+j])、等價於:a[i+j][0],引用的是陣列元素a[i+j][0],而不是a[i][j],很可能早已超出陣列定義的範圍。

在(5)中,&a[0][0]+4*i+j代表了陣列元素a[i][j]的位址,通過間址運算子*號,表示式*(&a[0][0]+4*i+j)代表了陣列元素a[i][j]的儲存單元。

3、通過建立乙個指標陣列來引用二維陣列元素若有以下定義:int *p[3], a[3][2], i,j ;在這裡,說明符*p[3]中,也遵照運算子的優先順序,一對的優先順序高於*號,因此p首先與結合,構成p[3],說明了p是乙個陣列名,系統將為它開闢3個連續的儲存單元;在它前面的*號則說明了陣列p是指標型別,它的每個元素都是基型別為int的指標。若滿足條件:0≤i<3,則p[i]和a[i]的基型別相同,p[i]= a[i]是合法的賦值表示式。

若有以下迴圈:for(i=0; i<3; i++) p[i]= a[i];在這裡,賦值號右邊的a[i]是常量,表示a陣列每行的首位址,賦值號左邊的p[i]是指標變數,迴圈執行的結果使p[0]、p[1]、p[2]分別指向a陣列每行的開頭。這時,陣列p和陣列a之間的關係如圖9.6所示。

當p陣列的每個元素已如圖9.6所示指向a陣列每行的開頭時,則a陣列元素a[i][j]的引用形式*(a[i]+ j)和*(p[i]+j)是完全等價的。由此可見,這時可以通過指標陣列p來引用a陣列元素,它們的等價形式如下:(1)*(p[i]+j) (2)*(*(p+i)+j) (3)(*(p+i))[j] (4)p[i][j] 不同的是:p[i]中的值是可變的,而a[i]中的值是不可變的。

圖9.64、通過建立乙個行指標來引用二維陣列元素若有以下定義:int a[3][2], (*prt)[2];在這裡,說明符(*prt)[2]中,由於一對圓括號的存在,所以*號首先與prt結合,說明prt是乙個指標變數,然後再與說明符[2]結合,說明指標變數prt的基型別是乙個包含有兩個int元素的陣列。在這裡,prt的基型別與a的相同,因此prt=a;是合法的賦值語句。prt+1等價於a+1、等價於a[1]。當prt指向a陣列的開頭時,可以通過以下形式來引用a[i][j]:(1) *(prt[i]+j) (2) *(*(prt+i)+j) (3)(*(prt+i))[j] (4) prt[i][j] 在這裡,prt是個指標變數,它的值可變,而a是乙個常量。附:

#include "stdio.h"

void disp(int (*a)[3])

void main()

二維陣列與二維指標

1.二維陣列的儲存是線性的,可以通過一維指標的方式訪問。如一下 int map 5 5 int mapd map 0 0 則 map i j mapd i 5 j 而利用二維陣列線性儲存的特性,可以將二維陣列當作一維指標方便的在函式之間傳遞 如 將乙個二維陣列賦值給乙個動態二維陣列,引數設定為一維指...

二維陣列與二維指標

一.指標與二維陣列 以martix 3 4 為例 1.二維陣列的本質 int martix 3 4 int martix 3 4 int 4 martix 3 令int 4 為type,type martix 3 為含有三個元素的陣列,每乙個元素型別為int 4 int 4 是乙個擁有4個int型別...

指標與二維陣列

乙個二維陣列在計算機中儲存時,是按照先行後列的順序依次儲存的,當把每一行看作乙個整體,即視為乙個大的陣列元素時,這個儲存的二維陣列也就變成了乙個一維陣列了。而每個大陣列元素對應二維陣列的一行,我們就稱之為行陣列元素,顯然每個行陣列元素都是乙個一維陣列。也即是int a 3 3 把,分別看作乙個大的陣...