二維陣列解析

2021-05-26 08:06:05 字數 2827 閱讀 6516

當我們寫下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...