二維數組知多少


有的實際問題一維數組是無法解決的,所以引入二維數組甚至是多維數組,這裏着重討論一下二維數組,如果深刻理解二維數組多維數組也就迎刃而解。

1. 二維數組的定義:例如現在有3支球隊,每支隊有5個人,要充分表達每個人便可以引入二維數組,例如a[0][0]就表示第一支隊伍的第一個人。這裏的a便是數組名,第一個[0]表示第一支隊伍,第二個[0]表示第一支隊伍裏的第一個人。根據此類比喻可以根據條件要求將二維數組擴展爲多維數組。

2. 二維數組在內存中佈局:我們可以把二維數組的佈局想象成表格,第一行表格便是第一行一維數組,但是事實上二維數組在內存中的佈局並不是這樣的,因爲內存不是表狀的,而是線形狀的。相當於一把尺子,變量在內存中開闢的值便從尺子的高地址處依次向第地址出排布的,那麼二維數組的存儲也符合這樣的規則,從較高地址處排布a[0][0]直到較低地址處排布a[3][5],直到整個數組存儲完畢。二維數組在內存中存儲遵循最右邊下標率先變化的規則,例如int *p; p=a[0][0]; ++p; 那麼++p是誰的地址呢?根據上述規則的++p應該是*a[0][1]。對於[][]裏面的下標可以認爲第一個爲行,也可以認爲它表示列,這些沒有嚴格的限制,只要遵循上下文的邏輯意思,同時不改變它的實際存儲方式即可。

3. 二維數組名:首先我們知道數組名就是數組首元素的地址,所以a便是&a[0],又因爲a[0]是第一行的一維數組,它也是一個數組名,它也代表該一維數組首元素的地址,a[0]=&(一維數組第一個元素)。所以說,可以把二維數組理解爲一個二級指針便不難理解。a+1便讓二維數組偏移到了第二行的以爲數組,它等同於(&a[0]+1),(&a[0]+1)表示是指向第二行一維數組的指針,所以*(&a[0]+1)便的到第二行一維數組的名字,即*(a+1)也是第二行一維數組的名字,即a[1],*(*(a+1)+1)便是a[1][1]的值。

4. 二維數組的初始化:二維數組初始化有兩種方式,第一種是給出長長的初始值列表例如int a[2][2]={1,2,3,4};第二種方式是int a[2][2]={1,2},使用包含2個複雜元素的一維數組。

5.  指向二維數組的指針,如果有int a[5]; int *p=a,這是正確的,p是一個指向整型的指針,並且把它初始化指向數組a的第一個元素。對於二維數組int a[2][2]; int *p=a,是不對的,因爲p是一個指向整型的變量,它並沒有能力指向一個數組,所以應該這樣寫:int a[2][2]; int (*p)[2]=a; p是一個指向擁有2個整型元素的數組的指針,也就是一個數組指針變量,初始化爲a。

6.  函數參數中二維數組用法:和一維數組相同,二維數組名實際傳過去的是指向數組第一個元素的指針,因爲二維數組中每個元素又是一個一維數組,所以編譯器需要知道它的位數。在一維數組中我們知道,函數的形參原型有兩種書寫方式,例如:void(int *p)或void(int p[])。這裏我們可以進行模仿 例如:void(int (*p)[2])或者void(int p[][2]),第一個表示一個指針數組,它有能力指向有兩個元素的一維數組,所以這樣接收實參不會有問題;第二種表示第二種是一種數組的形式接收形參,其實和一維數組同理,它還是接收的是數組的地址。這兩種方式都同時要注意第一維的寫法可以變化,但是第二維的數字絕對都能省略,因爲只有知道它才能對各下標進行求值運算。

   對於二維數組在函數中的實參:實參直接用數組名即可

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章