二維陣列和指標

2021-07-11 21:37:42 字數 2760 閱讀 4029

關於c語言的指標,我覺得真正難的是:當指標和二維陣列摻和起來的時候,太令人腎疼了。如果你不是很清楚一維指標,不要看這篇文章!!!這篇文章中寫的都是我對二維陣列和指標的理解,並沒有真正可靠的出處。

對二維陣列(int a[3][4])的理解

(0). 二維陣列中有很多看起來一樣,但所包含的意義不一樣的東西,煞是蛋疼,注意區分。

(1). 從二維陣列的角度來看,a代表二維陣列首元素的位址,

對二維陣列來說,它的首元素不是乙個簡單的元素了,而是由4個整型元素構成的一維陣列。 (這個時候把一維陣列看成乙個元素)

所以a是第乙個一維陣列的位址,a+1是第二個一維陣列的位址。

(2). 二維陣列可以理解為陣列的陣列,把每一行看成乙個一維陣列。

a是二維陣列名,a中有3行,即3個行元素,a[0],a[1],a[2],每乙個行元素是乙個一維陣列。

所以可以把a[0]理解為乙個一維陣列的陣列名(也就是這個一維陣列的首元素地)。

那麼a[0]+1是二維陣列0行1列的那個元素的位址,a[0]與&a[0][0]等價,a[0]+1與&a[0][1]等價就很容易理解了。(在一維陣列的層面去理解上面的問題)

特別注意:在二維陣列a中,a[i]不代表某一元素的值,它代表的是乙個一維陣列名。

(3). 如果像(2).那樣,把二維陣列看成一維陣列(a[3])。

它的第乙個元素是a[0],我們可以通過a[0]或者通過指標的方式去訪問第乙個元素*(a+0)。

所以*(a+1)和a[1]是等價的。都是訪問a[1]這個元素的。這一點也就很容易理解了。

a[0]也是乙個一維陣列(假設為n[4]),

所以把*(a+0)或者a[0]理解為這個一維陣列的陣列名n(也就是這個一維陣列的首元素位址)。

*(a+0)+1就是n這個一維陣列的第二個元素的位址。

(4). 在指向行的指標前面加乙個*,就轉換成了指向列的指標。

例如,a和a+1是指向行的,前面加個*就是指向列的了

反之,在指向列的指標前面加上&,就變成指向行的了。

例如,a[0]是指向0行0列元素的指標,在它的前面加上乙個&,得到&a[0],它指向二維陣列的0行

注意:在二維陣列中,不要把&a[i]簡單的理解為元素a[i]的實體地址,因為並不存在a[i]這樣乙個實際的資料儲存單元。

它只是一種位址的計算方法,得到第i行的行位址。

(5). 上面出現的a,a[0],*(a+0),&a[0][0],&a[0]的值都是相同的,不過所包含的含義是有區別的!!!!!!

上面如果沒有理解,或者不贊同的話,不要繼續看下去!!!

指向二維陣列a[3][4]的指標

有兩種方法將指標指向二維陣列。

1.int *p;

2.int (*p)[4];

這兩種方法的定義,初始化,使用都是有區別的。

int *p;

這是乙個指向乙個整型資料的指標,所以我們在初始化的時候,只能把某個整型元素的位址給p。

例如:

// p=a; // p=&a[0]; // p=a[0]; // p=*a; // p=&a[0][0];

//前兩個會報錯後面三個則不會。

因為二維陣列中的元素也是連續存放的,所以也可以把二維陣列a[3][4]看成a[12]這個一維陣列,然後就可以像一維陣列那樣使用p了。

int (*p)[4];

這個時候p不是指向整型資料的指標了,而是變成了指向乙個包含m個元素的一維陣列的指標了。

這個時候p的型別不是int 了,而是int [4]。

// p=a; // p=&a[0]; // p=a[0]; // p=*a; // p=&a[0][0];

// 後三個會報錯,前兩個不會

int (*p)[4]的使用:

1.這個時候p的型別是int *[4],則p++實際上位址是加了16。

2.可以直接通過(*p)[i]去訪問p所指向的一維陣列的第i個元素

3.也可以通過二級指標的形式去訪問其中的元素。

例如:(*p)[i]和 * (*(p)+i)是等價的。

#include

int main()

;

int (*p)[2];

p=a;

printf("%d\n",(*p)[1]);

printf("%d\n", *(

*(p)+1) );

printf("%d\n", *(

*(p)+3) );

printf("%d\n", *(

*(p+1)+1) );

return

0; }//輸出結果是2,2,4,4

附加:

#include

int main()

;int (*p)[4];

//int (*p)[4]也可以指向一維陣列

p=&a;

//注意這兒不能寫成p=a;

//這個時候a是一維陣列,陣列名就代表首元素位址,和p的型別不符合

//a前面加&就可以表示行位址了

//這個時候就有點把一維陣列擴充套件成二維陣列那樣(有行位址有元素位址)的感覺了

printf("%d\n",(*p)[1]);

printf("%d\n", *(

*(p)+1) );

printf("%d\n", *(

*(p)+3) );

return

0; }

二維陣列 二維陣列和指標

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

二維陣列和指標

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