指標和二維陣列

2021-08-10 14:10:14 字數 1709 閱讀 7597

在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到底指向幾個指標是不知道的...

二維陣列和指標

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