二維陣列在計算機中儲存時,是按照行形式儲存的。即把每一行看做乙個整體,然後再把每一行的首位址進行索引,這樣就變成了乙個儲存著每行首位址的一維陣列。
例如對於二維陣列num[2][2]=;可以理解為是乙個一維陣列p,這個一維陣列p有兩個元素,分別為num[0]與num[1],num[0]儲存著num陣列第一行的首位址,num[1]儲存著第二行的首位址。
int num[2][2]=;
cout<
cout<
輸出結果為1,3.分別是第一行與第二行的首元素。
二維陣列用指標索引的方法有兩種,一種是實用一維指標int *進行索引,一種是使用二維陣列指標int (*)[2]進行索引,具體使用見**。
1. 一維指標進行索引
int num[2][2]=;
int *p1=num[0];
cout<
cout<
定義乙個一維指標p1,把二維陣列當做一維陣列去進行索引,可以如第3行,通過指標索引,也可以如第4行,通過陣列索引。
需要注意的一點,第二行num[0]可以看做是這個二維陣列的起始位址。不可以使用int *p=num;這樣的賦值方式,因為num是乙個二維陣列指標。可以通過指標型別強制轉化,進行賦值:int *p=(int *)num
2. 二維陣列指標進行索引
int num[2][2]=;
int (*p2)[2];
p2=num;
cout<
cout<
定義乙個陣列指標p2,p2的列數必須與指向的二維陣列列數相同。這裡必須給int (*p2)[2]加括號,因為的優先順序是大於*的優先順序。具體可以參考我的另一篇部落格:
陣列指標可以像陣列名一樣,使用下標或者指標增加來進行索引。
總結:其實無論是方式1還是方式2,二維陣列在記憶體中都是順序儲存的。因此不同的索引方式只是索引規則的不同而已,遵循一維指標及陣列指標的使用方法即可正常索引。可以通過使用指標型別強制轉換來實現方式1與方式2的轉化。
二維陣列做函式引數:
根據之前的介紹,二維陣列函式引數可以有一下幾種方式
1.func(int num[2][2]);
2.func(int num[2]);
3.func(int (* p2)[2]):
4.func(int * p1)
需要注意的是,第1,2種方式是直接用二維陣列做形參,二維陣列做形參時,列數必須寫出來,而行數不是必須的。第3種方式是使用陣列指標的方式來作為函式形參。以上三種方式都可以在func中使用num[i][j]或者*(*(num+i)+j)的方式進行索引。第4種方式是使用一維指標的形式來代替二維陣列,這種方式在使用時要注意,實際的func在呼叫的時候,需要對二維陣列實參進行指標型別強制轉換。使用這種方式時,func內只能使用p1[i]和*(p1+i)的方式索引值。
C 中的二維陣列
在記憶體中的資料只能是一維的,對於二維陣列在記憶體中是以開闢連續的記憶體空間,陣列名就是二維陣列陣列名就是記憶體空間的手位址,和函式 變數一樣其名就是記憶體中的首位址,下面是最近學的二維陣列的用法。1 和c語言一樣的方法 這種方法陣列大小不能太大,否則會出錯。int main for i 0 i2 ...
C 二維陣列
c 二維陣列 微學苑 具有兩個下標的陣列稱為二維陣列。有些資料要依賴於兩個因素才能惟一地確定,例如有3個學生,每個學生有4門課的成績,顯然,成績資料是乙個二維表,如書中表5.1所示。表5.1 學生成績資料表 學生序號 課程1課程2 課程3課程4 課程5學生1 8578 9996 88學生2 7689...
C 二維陣列
c 二維陣列 微學苑 具有兩個下標的陣列稱為二維陣列。有些資料要依賴於兩個因素才能惟一地確定,例如有3個學生,每個學生有4門課的成績,顯然,成績資料是乙個二維表,如書中表5.1所示。表5.1 學生成績資料表 學生序號 課程1課程2 課程3課程4 課程5學生1 8578 9996 88學生2 7689...