關於用指標方式訪問二維陣列的問題

2021-07-08 10:34:13 字數 1171 閱讀 4300

首先,以二維陣列a[2][3]為例,a是由陣列a[0]、a[1]組成的一維陣列,因此,陣列名a可以看作是a[0]、a[1]的首位址,即a==&a[0]。

然後,對於二維陣列,在這裡引入兩個概念:

1、一級指標:帶乙個下標的陣列名是一級指標,偏移量是乙個元素的長度,它所指物件是陣列元素。

2、二級指標:不帶下標的陣列名是乙個邏輯上的二級指標,所指物件是行向量,偏移量是一行元素的儲存長度。

定義乙個二維陣列和二級指標變數

int a[2][3],**p;

不可以用p=a;

因為p的定義可以解讀為:int *(*p);

即指標p的關聯型別為int* 而陣列a的定義可以解讀為:

int(a[2])[3];

a是關聯型別為int[3]的一維陣列。

很顯然,a與p的關聯型別都不一樣,故而不能用p去操作a。

在這舉乙個例子來說明:

如p+i的位址偏移量為p+sizeof(int*) *i

而a+i的位址偏移量為a+sizeof(int[4])*i

顯然二級指標變數與二維陣列名是不同的,我們必須定義乙個指向一維陣列的指標來操作邏輯上位二級指標的二維陣列名。

下面舉乙個例項:

#include

#include

using

namespace

std;

int main()

;int i,j,total=0;

int *p,(*m)[3]; //m為指向一維陣列的指標

for(p=a[0];p0]+6;p++)

total+=*p;

cout

<

}

執行結果如下:

在這個程式中,m是乙個指向長度為3的一維陣列指標,執行m=a+i;時,其指向二維陣列第i行。

而*m+j 為第i行第j列元素的位址,即&a[i][j],

故* (*p+j) 是訪問元素a[i][j]

注意:在二維陣列中a=&a[0] , a+1=&a[1] ,

而a[0]=&a[0][0] ,a[0]+1=&a[0][1]

指標訪問二維陣列

之前對陣列的概念一直沒有理解透徹,只覺得陣列名就是個常量指標而已,用法和基本的指標差不多。所以當我嘗試用二級指標去訪問二維陣列時,就經常會出錯。下面就是剛開始寫的乙個錯誤的程式 include int main int parray null parray iarray printf array 0...

用指標輸出二維陣列

include stdafx.h include using namespace std int tmain int argc,tchar argv int p 指標p是指向整型資料的指標變數 for p a 0 pcout endl int pp 4 指標pp是指向由4個元素組成的一位陣列的指標變...

用指標表示二維陣列的4種方式

劇情回顧 12 25 周五,華老師說如果能自己寫出來4種方式,就因該掌握了,指標在陣列方面的應用。於是有了,這篇文章,文章的內容會同步到 指標 心路歷程 這篇部落格中。1.列指標 2.行指標 3.指標陣列 4.二級指標 強調一點 指標 在引用的時候,應該避免出現歧義。例如 int a 3 4 int...