二維陣列和指標

2021-07-04 12:06:34 字數 2634 閱讀 8830

二維陣列和指標

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

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()

二維陣列 二維陣列和指標

include using namespace std int main 如上面這段程式所示,通過取位址符 指標 p 獲得了變數 a 的位址,那麼解引用符 就可以從 p 中得到變數 a 的值。也就是說,p a和 p a是等價的。p 是變數 a 的位址,從 p 中就可以取出 a 的值。反之,能從 p ...

二維指標和二維陣列

二維指標和二維陣列有三種形式 1,type ptr 2,type ptr或者type prt 3,type prt 三種形式意思相近,也有區別。首先三種形式都能表示二維的資料結構。1,type ptr 表示乙個指向指標的指標 但是在一開始宣告的時候 type ptr ptr到底指向幾個指標是不知道的...

二維陣列和指標

二維陣列和指標 用指標表示二維陣列元素。要用指標處理二維陣列,首先要解決從儲存的角度對二維陣列的認識問題。我們知道,乙個二維陣列在計算機中儲存時,是按照先行後列的順序依次儲存的,當把每一行看作乙個整體,即視為乙個大的陣列元素時,這個儲存的二維陣列也就變成了乙個一維陣列了。而每個大陣列元素對應二維陣列...