指標與二維陣列

2021-08-09 22:36:20 字數 2681 閱讀 1836

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

也即是int a[3][3]=,,};把,,分別看作乙個大的陣列。

指標與二維陣列的關係

設p是指向陣列a的指標變數,若有:

p=a[0];

則p+j將指向a[0]陣列中的元素a[0][j]。

由於a[0]、a[1]┅a[m-1]等各個行陣列依次連續儲存,則對於a陣列中的任一元素a[i][j],指標的一般形式如下

p+i*n+j

元素a[i][j]相應的指標表示為:

*( p+i*n+j)

同樣,a[i][j]也可使用指標下標法表示,如下:

p[i*n+j]

例如,有如下定義:

int a[3][4]=,,};

則陣列a有3個元素,分別為a[0]、a[1]、a[2]。而每個元素都是乙個一維陣列,各包含4個元素,如a[1]的4個元素是a[1][0]、a[1][1]、a[1]2]、a[1][3]。

若有:int *p=a[0];

則陣列a的元素a[1][2]對應的指標為:p+1*4+2

元素a[1][2]也就可以表示為:*( p+1*4+2)

用下標表示法,a[1][2]表示為:p[1*4+2]

特別說明:

(1)對上述二維陣列a,雖然a[0]、a都是陣列首位址,但二者指向的物件不同,a[0]是一維陣列的名字,它指向的是a[0]陣列的首元素,對其進行「*」運算,得到的是乙個陣列元素值,即a[0]陣列首元素值,因此,*a[0]與a[0][0]是同乙個值;而a是乙個二維陣列的名字,它指向的是它所屬元素的首元素,它的每乙個元素都是乙個行陣列,因此,它的指標移動單位是「行」,所以a+i指向的是第i個行陣列,即指向a[i]。對a進行「*」運算,得到的是一維陣列a[0]的首位址,即*a與a[0]是同乙個值。當用int *p;定義指標p時,p的指向是乙個int型資料,而不是乙個位址,因此,用a[0]對p賦值是正確的,而用a對p賦值是錯誤的。這一點請讀者務必注意。

⑵ 用二維陣列名作位址表示陣列元素。

另外,由上述說明,我們還可以得到二維陣列元素的一種表示方法:

對於二維陣列a,其a[0]陣列由a指向,a[1]陣列則由a+1指向,a[2]陣列由a+2指向,以此類推。因此,*a與a[0]等價、*(a+1)與a[1]等價、*(a+2)與a[2]等價,┅,即對於a[i]陣列,由*(a+i)指向。由此,對於陣列元素a[i][j],用陣列名a的表示形式為:

*(*(a+i)+j)

指向該元素的指標為:

*(a+i)+j

陣列名雖然是陣列的位址,但它和指向陣列的指標變數不完全相同。指標變數的值可以改變,即它可以隨時指向不同的陣列或同型別變數,而陣列名自它定義時起就確定下來,不能通過賦值的方式使該陣列名指向另外乙個陣列。

例4 求二維陣列元素的最大值。

該問題只需對陣列元素遍歷,即可求解。因此,可以通過順序移動

陣列指標的方法實現。

main()

,,};

int *p,max;

for(p=a[0],max=*p;pmax)

max=*p;

printf("max=%d/n",max);

}

執行結果:

max=88

這個程式的主要演算法都是在for語句中實現的:p是乙個int型指標變數;p=a[0]是置陣列的首元素位址為指標初值;max=*p將陣列的首元素值a[0][0]作為最大值初值;p二維陣列元素的最大值,並確定最大值元素所在的行和列。

本例較之上例有更進一步的要求,需要在比較的過程中,把較大值元素的位置記錄下來,顯然僅用上述指標移動方法是不行的,需要使用能提供行列資料的指標表示方法。

main()

,,};

int *p,max;

for(p=a[0],max=*p;pmax)

max=*p;

printf("max=%d/n",max);

}

程式執行結果:

a[2][1]=88

⑶ 行陣列指標

在上面的說明中我們已經知道,

二維陣列名是指向行的,它不能對如下說明的指標變數p直接賦值:

int a[3][4]=,,},*p;

其原因就是p與a的物件性質不同,或者說二者不是同一級指標。c語言可以通過定義行

陣列指標的方法,使得乙個指標變數與

二維陣列名具有相同的性質。行

陣列指標的定義方法如下:

資料型別 (*指標變數名)[

二維陣列列數];

例如,對上述a陣列,行

陣列指標定義如下:

int (*p)[4];

它表示,陣列*p有4個int型元素,分別為(*p)[0]、(*p)[1]、(*p)[2]、(*p)[3] ,亦即p指向的是有4個int型元素的一維陣列,即p為行指標

此時,可用如下方式對指標p賦值:

p=a;

二維陣列與二維指標

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型別...

二維陣列與指標

1 二維陣列和陣列元素的位址若有以下定義 int p,a 3 4 注意此處的int,定義為2位元組長度大小 1 二維陣列a由若干個一維陣列組成,在c語言 中定義的二維陣列實際上是乙個一維陣列,這個一維陣列的每乙個成員又是乙個一維陣列。如以上定義的a陣列,則可視a陣列由a 0 a 1 a 2 等三個元...