今天為啥想寫這個呢?因為從自我的體會,就是有很多人學習了c語言很多年,如果有一天讓他寫一個二維數組的初始化,都會很迷茫,感覺這樣也可以,那樣也可以,心里面不是很確定。
其實c語言是一個比較靠近硬件設計的語言,也就是c語言很照顧每一個數據在內存怎么擺放的,如果你能理解c語言的二維數組在內存怎么擺放的,那么你也就不會在二維數組的初始化方面迷茫和混沌了。
首先講一下二維對象,這個大家應該都能明白,就是二維方向的數據變換,對於一張圖像來說,在數字化圖像的概念中,在相機的圖像傳感器上規定了圖像坐標系就是二維的,一般規定左上角為原點,橫向為x坐標,縱向為y坐標。
二維對象一般用二維數組存儲和表達。二維數組在概念上是二維的,即是說其下標在兩個方向上變化,下標變量在數組中的位置也處於一個平面之中,而不是象一維數組只是一個向量。
但是,實際的硬件存儲器卻是連續編址的,也就是說存儲器單元是按一維線性排列的。如何在一維存儲器中存放二維數組,可有兩種方式:一種是按行排列, 即放完一行之后順次放入第二行。另一種是按列排列, 即放完一列之后再順次放入第二列。
在C語言中,二維數組是按行排列的。即,先存放a[0]行,再存放a[1]行,最后存放a[2]行。每行中有四個元素也是依次存放。由於數組a說明為int類型,該類型占兩個字節的內存空間,所以每個元素均占有兩個字節。這個是基本常識,一般的c語言書中是不提這個的,還是多了解一下。另外硬件的內存,一般重置的時候為0,但是在動態過程中都會被污染,所以,最好初始化的時候給出初始值,或者編譯器直接給出初始化值。
二維數組一般屬於靜態分配的內存,在內存空間上一般屬於全家變量,一般給出內存空間,不會釋放和收回。
了解這么多了,你就應該知道怎么初始化一個二維的數組了吧。
例如對數組a[5][3]:
- 按行分段賦值可寫為:
int a[5][3]={ {80,75,92}, {61,65,71}, {59,63,70}, {85,87,90}, {76,77,85} };
- 按行連續賦值可寫為:
int a[5][3]={ 80,75,92,61,65,71,59,63,70,85,87,90,76,77,85};
這兩種賦初值的結果是完全相同的。
可以只對部分元素賦初值,未賦初值的元素自動取0值。例如:
- int a[3][3]={{1},{2},{3}};
是對每一行的第一列元素賦值,未賦值的元素取0值。 賦值后各元素的值為:
1 0 0
2 0 0
3 0 0
- int a [3][3]={{0,1},{0,0,2},{3}};
賦值后的元素值為:
0 1 0
0 0 2
3 0 0
如對全部元素賦初值,則第一維的長度可以不給出。例如:
- int a[3][3]={1,2,3,4,5,6,7,8,9};
可以寫為:
- int a[][3]={1,2,3,4,5,6,7,8,9};
最后在講一下二維數組和一維數組的關系:
一維數組和二維數組都是數組,數組是一種構造類型的數據。二維數組可以看作是由一維數組的嵌套而構成的。設一維數組的每個元素都又是一個數組,就組成了二維數組。當然,前提是各元素類型必須相同。根據這樣的分析,一個二維數組也可以分解為多個一維數組。C語言允許這種分解。
如二維數組a[3][4],可分解為三個一維數組,其數組名分別為:
a[0]
a[1]
a[2]
對這三個一維數組不需另作說明即可使用。這三個一維數組都有4個元素,例如:一維數組a[0]的元素為a[0][0],a[0][1],a[0][2],a[0][3]。必須強調的是,a[0],a[1],a[2]不能當作下標變量使用,它們是數組名,不是一個單純的下標變量