二維陣列和指標
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()
二維陣列和指標 C語言)
二維陣列和指標 c語言 loveyou 二維陣列和指標 1 二維陣列a由若干個一維陣列組成在c語言中定義的二維陣列實際上是乙個一維陣列,這個一維陣列的每乙個成員又是乙個一維陣列。如以上定義的a陣列,則可視a陣列由a 0 a 1 a 2 等三個元素組成,而a 0 a 1 a 2 等每個元素又分別是由4...
C語言二維陣列指標(指向二維陣列的指標)
二維陣列的定義 int matrix 見圖的操作那篇文章裡面的定義 或者這篇文章提供了另外一種方法。二維陣列在概念上是二維的,有行和列,但在記憶體中所有的陣列元素都是連續排列的,它們之間沒有 縫隙 以下面的二維陣列 a 為例 int a 3 4 從概念上理解,a 的分布像乙個矩陣 0 1 2 3 4...
C語言補漏 指標和二維陣列
二維陣列的其實就是在一維陣列上進行擴充套件的。假設我們已經定義了乙個二維陣列array如下 array是二維二維陣列的首位址。由於是二維陣列,也就是指向包含五個元素的陣列的指標。跨度是五個元素。下面的例子 include int main printf size of int d n sizeof ...