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