當我們寫下int a[3][4]; 的時候,我不知道有多少學c語言的具體明白這個陣列背後隱藏的東西。
a代表什麼,&a代表什麼,a[0]代表什麼等等。
假設我們根本就沒有接觸過二維陣列。當然我們至少得知道一維陣列的知識。
我們採用從右到左的識別變數的方式來分析二維陣列:
首先向右看,與a結合的是[3],即a[3],什麼意思,明白吧,a是乙個包含3個元素的陣列。那麼元素的型別是什麼呢,剩下的殼肯定就是它的型別薩。剩下的是:int [4] 。哦,知道了,元素的型別是:(包含4個整形資料的一維陣列)型別。
a ->a[0] -->a[0][0],a[0][1],a[0][2],a[0][3]
a[1] -->a[1][0],a[1][1],a[1][2],a[1][3]
a[2] -->a[2][0],a[2][1],a[2][2],a[2][3]
而a[0][0]是第乙個一維陣列的第乙個元素。也就是:a[0]是第乙個陣列元素的第乙個元素的位址。而我們根據陣列名的定義,陣列名表示陣列第乙個元素的位址。所以a[0]即第乙個陣列(元素)的陣列名。同理a[1]表示第二個陣列的陣列名,a[2]表示第三個陣列的陣列名。
a是什麼意思? 好吧,我麼一樣來分析a = a+0 =&(*(a+0)) =&a[0] = &(a[0]+0) = &( & (*(a[0]+0)) = &&a[0][0].即a表示
第乙個陣列的第乙個元素的位址的位址。第乙個陣列的第乙個元素的位址即陣列名a[0],所以a表示a[0]的位址,同理a+1表示a[1]的位址,a+2 表示a[2]的位址。
a的另外一種理解: a[3] 表示a是乙個包含3個元素的一維陣列,a是這個一維陣列的陣列名,即這個一維陣列的位址。a+0 = =&(*(a+0) =&a[0] a是這個陣列的第乙個元素的位址(整個一維陣列的位址,陣列名都是一樣的),a+1=&a[0] 是這個陣列第二個元素的位址。
&a有是什麼意思?暈了吧,這裡我們就要採取更絕的方式來理解拉,一維陣列的概念我們都拋一邊。a是乙個變數,整個變數的型別是什麼,剩下的就是它的型別貝,哦,int [3][4] ,我們不管這後面有多麼的一大堆的東西,反正變數a現在表示的是12個整形大小(48個位元組)的一片記憶體。這12個整形是乙個整體,和我們平時的任何基本資料型別都是一樣(思想:複雜問題傻瓜化)。即假設有這麼一種基本型別,它占用48個位元組大小的乙個空間。那麼,&a好理解了吧,不就是這48個這麼大小的空間的位址嗎。不過我們注意拉,&a+1表示的是下乙個48位元組的空間的位址。
如果還不好理解,我們通過型別定義來看看:
typedef int type48bytes[3][4];//=== typedef int [3][4] type48bytes;
type48bytes a;
或者:typedef struct type48bytes;
type48bytes a;
我們再來分析怎麼定義指向二維陣列的指標。
現來看看一維陣列的指標是怎麼定義的:假設有 int b[4];
那我們看到的肯定就是則會樣的形式: int * p = b;
為什麼是這樣的呢(我以前沒有思考過,你們估計也沒思考過),b = b+0 = &(*(b+0)) = &b[0] 所以b就是第乙個元素的位址,這個元素是int型,所以,賦值符號兩邊型別剛好對應。
那二維陣列呢: int a[3][4];
同理: a = &a[0] ,好了,上面分析中b[0]為整形,所以b = &b[0] == int *, 可以推理,現在如果a[0]是什麼型別,那麼指標應該就是指向該型別的指標。a[0] 不就是 int [4]型別嗎? 所以指標的定義應該為: int (*p)[4];
即int (*p)[4] = a;
我們驗證上面的是正確的,可以知道,p指標指向的是包含4個整形那麼個大小的空間 p+1應該就是指向下乙個那麼大小的空間,也就是a[1],同理p+2 指向 a[2].
其實通過上面我們可以總結出這樣一條規律:即將我們等式右邊的式子表示為:&type 則 type是什麼型別,那麼指標就是什麼型別的指標。
如: int a[3]; 顯然a = &a[0] a[0]是整形,所以指標為int * ; int * p = a;
那麼&a呢,那不就是看a的型別嗎?a的型別不就是int [3]型別嗎?所以 int (*p)[3] =&a;
int a[3][4];
a[0] = &a[0][0] 所以指標型別為a[0][0] 整形指標 int *; int * p = a[0];
a = &a[0] a[0]是int [4] 型別,所以指標為 int (*)[4]; int (*p)[4] = a;
&a 這個有點麻煩,a是什麼型別呢,利a最近的是a[3],所以a是含有3個 int [4] 元素的陣列型別,即指標型別為,int [4] (*)[3]
= int (*)[3][4]
所以 int (*p)[3][4] = &a;
哈哈,發現了規律,對於陣列名取位址,總是為 型別 (*)p[一維][二維]...[n維]) =&a;
同理當位址越來越具體的話,就是依次去掉第一維,第二維,第三維,第n維;
如:int (*p)[4] = a
int *p = a[0];
output輸出如下:
a type=int *
&a type=int (*)[6]
p[0] type=int *
p type=int (*)[3]
&p type=int (*)[2][3]
a=0012ff68
&a=0012ff68
p[0]=0012ff50
p=0012ff50
&p=0012ff50
通過上面的分析,我們再結合老師的教條,對二維陣列的理解就差不多拉。
二維陣列 二維陣列和指標
include using namespace std int main 如上面這段程式所示,通過取位址符 指標 p 獲得了變數 a 的位址,那麼解引用符 就可以從 p 中得到變數 a 的值。也就是說,p a和 p a是等價的。p 是變數 a 的位址,從 p 中就可以取出 a 的值。反之,能從 p ...
陣列 二維陣列
一組相同型別的資料組合,是一種引用型別。陣列名稱不是固定的,與其存放的資料的型別有關。如 存放int型別的資料,陣列名稱 int 存放字串資料,陣列名稱 string 存放scanner型別的資料,陣列名稱 scanner陣列中的每個資料,都是這個陣列的元素。1 宣告 元素型別 變數名 元素型別 變...
陣列 二維陣列
陣列,從名字很簡單看出就是數字組合,一堆數 一堆元素 在一起。然後看一下怎麼定義,怎麼初始化。陣列的動態初始化 初始化之後每個元素的儲存內容為其對應資料型別的預設值。資料型別 陣列名 new 陣列型別 大小 int arr new int 5 資料型別 陣列名 new 陣列型別 大小 int arr...