在c++中,二維陣列元素值在記憶體中是按行的順序存放的,即先存二維陣列的第一行資料,然後再儲存第二行資料,一次類推,可以把它看成是乙個特殊的一維陣列。因此,與一維陣列類似,可用指標變數來訪問二維陣列。我們可以像使用一維陣列一樣,對二維陣列進行操作。但是那樣非常麻煩,所以c++提供了關於二維陣列的單獨操作方法。
首先搞清楚三個概念:
1. 二維陣列行首位址
二維陣列各元素按行排列可寫成矩陣形式,若將第i行中的元素a[i][0])、a[i][1]… a[i][n]組成一維陣列a[i](i=0, …,n),則有:
a[0] = (a[0][0], ..., a[0][n])
a[m] = (a[m][0], a[m][1], …, a[m][n]
因為陣列名可用來表示陣列的首位址,所以一維陣列名a[i]可表示一維陣列(a[i][0], a[i][1], a[i][2], ...,a[i][n])的首位址&a[i][0],即可表示第i行元素的首位址。因此,二維陣列a的第i行首位址(即第i行第0列元素位址)可用a[i]表示。
一維陣列的第i個元素位址可表示為「陣列名+i」,因此一維陣列a[i]中第j個元素a[i][j]的位址可表示為a[i]+j,即二維陣列a中第i行第j列元素a[i][j]的位址可用a[i]+j來表示,而元素a[i][j]的值為*(a[i]+j)。
2.二維陣列行位址
為了區別陣列指標與指向一維陣列的指標,c++引入了行位址的概念,並規定二維陣列a中第i行位址用a+i或&a[i]表示。行位址的值與行首位址的值是相同的,即a+i = &a[i] = a[i] = &a[i][0],但兩者型別不同,所以行位址a+i與&a[i]只能用於指向一維陣列的指標變數,而不能用於普通指標變數,如下所示:
int a[3][3];
int *p = a + 0
int *p = (int *)(a + 0);
二維陣列名a可用於表示二維陣列的首位址,但c++規定該首位址並不是二維陣列中第0行第0列的位址,即a != a[0][0],而是第0行的行位址,即a = a+0 = &a[0]。
3.二維陣列的元素位址與元素值
知道了二維陣列的行位址與行首位址後,可以討論二維陣列的元素位址。
因為a[i] = *(&a[i]) = *(a+1),所以*(a+1)可以表示第i行的首位址。因此二位陣列第i行的首位址有3種表示方法,即a[i]、*(a+1)、&a[i][0]。
由此可推知,第i行第j列元素a[i][j]的位址有4種表示方法,即a[i]+j、*(a+i)+j、&a[i][0]+j、&a[i][j]。
而第i行第j列元素a[i][j]的值也有4種表示方法:*(a[i]+j)、*(*(a+i)+j)、*(&a[i][0]+j)、a[i][j]。
二位陣列有關行位址、行首位址、元素位址、元素值的各種表示方法歸納:
第i行 行位址
a+i、&a[i]
第i行 首位址(第i行第0列位址)
a[i]、*(a+i)、&a[i][0]
元素a[i][j]的位址
a[i]+j、*(a+i)+j、&a[i][0]+j、&a[i][j]
第i行第j列元素值
*(a[i]+j)、*(*(a+i)+j)、*(&a[i][0]+j)、a[i][j]
二維陣列 二維陣列和指標
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到底指向幾個指標是不知道的...
二維陣列和指標
二維陣列和指標 用指標表示二維陣列元素。要用指標處理二維陣列,首先要解決從儲存的角度對二維陣列的認識問題。我們知道,乙個二維陣列在計算機中儲存時,是按照先行後列的順序依次儲存的,當把每一行看作乙個整體,即視為乙個大的陣列元素時,這個儲存的二維陣列也就變成了乙個一維陣列了。而每個大陣列元素對應二維陣列...