定義
二維數(shù)組定義的一般形式是:
類型說明符 數(shù)組名[常量1][常量2]
常量1:第一維下標(biāo)的長度
-
常量2:第二維下標(biāo)的長度
int a[3][4];
這個(gè)二維數(shù)組表示一個(gè)三行四列的整形變量集合,數(shù)組名為a,下標(biāo)變量的類型為整型。該數(shù)組的下標(biāo)變量共有3×4個(gè),即:
a[0][0], a[0][1], a[0][2], a[0][3]
a[1][0], a[1][1], a[1][2], a[1][3]
a[2][0], a[2][1], a[2][2], a[2][3]
仔細(xì)看這個(gè)二維數(shù)組,我們可以把它理解為一個(gè)二維坐標(biāo)系的位置。這個(gè)二維坐標(biāo)系的原點(diǎn)在左上角,x軸向右遞增,y軸向下遞增。(在計(jì)算機(jī)UI設(shè)計(jì)中,這種二維坐標(biāo)系經(jīng)常被使用)
如圖所示:

存儲(chǔ)形式
在內(nèi)存中,二維數(shù)組被保存成一段連續(xù)的內(nèi)存空間。就如同一個(gè)一維數(shù)組,二維數(shù)組也是按一維線性排列的。
具體的存儲(chǔ)方式有兩種:
- 按行排列
放完一行之后順次放入第二行。
- 按列排列
放完一列之后再順次放入第二列。
我們再回頭看一下這個(gè)二維數(shù)組:
int a[3][4];
其實(shí),在內(nèi)存中它的存儲(chǔ)方式相當(dāng)于:
int b[12];
只不過,計(jì)算機(jī)把它分成了三個(gè)部分。
a[0][0] 對應(yīng)于 b[0]
a[1][0] 對應(yīng)于 b[4]
a[3][0] 對應(yīng)于 b[8]
二維數(shù)組元素的引用
二維數(shù)組的元素也稱為雙下標(biāo)變量,其表示的形式為:
數(shù)組名[下標(biāo)][下標(biāo)]
其中下標(biāo)應(yīng)為整型常量或整型表達(dá)式。例如:
a[0][2]
表示數(shù)組a第一行第三列的元素。
在講一維數(shù)組時(shí),很多人反饋說無法區(qū)分?jǐn)?shù)組定義和引用時(shí)方括號中的內(nèi)容,今天我們來說一下這兩處用法的區(qū)別:
- 數(shù)組聲明的方括號中的是某一維的長度,即數(shù)組下標(biāo)最大值 + 1
- 數(shù)組引用中的下標(biāo)是該元素在數(shù)組中的位置標(biāo)識(shí)
- 前者只能是常量,而后者可以是常量,變量或表達(dá)式。
下面我們通過一個(gè)具體的例子來講解。
一個(gè)學(xué)習(xí)小組有5個(gè)人(A, B, C, D, E),三次考試每個(gè)人的成績?nèi)缦?。請編程?shí)現(xiàn)計(jì)算這個(gè)小組所有人三次考試的平均成績。

我們用一個(gè)二維數(shù)組a[5][3]存放五個(gè)人三次考試的成績。再用一個(gè)一維數(shù)組v[3]存放所求得每次考試的平均成績,最后求出v中三個(gè)成績的平均值。代碼如下:
int main(void)
{
int i, j, s = 0;
int average;
int v[3];
int a[5][3];
printf("input score:\n");
for(i = 0; i < 3; i++)
{
for(j = 0; j < 5; j++)
{
scanf("%d", &a[j][i]);
s += a[j][i];
}
v[i] = s / 5;
s = 0;
}
average = (v[0] + v[1] + v[2]) / 3;
printf("First:%d\nSecond:%d\nThird:%d\n", v[0], v[1], v[2]);
printf("Final Average:%d\n", average );
return 0;
}
執(zhí)行結(jié)果如下:

大家應(yīng)該都注意到了,我們通過scanf函數(shù)從鍵盤一個(gè)個(gè)錄入每個(gè)成績保存在二維數(shù)組中,這種方法太繁瑣。每次調(diào)試都需要輸入這15個(gè)數(shù)字,肯定沒人愿意。接下來我們看看有沒有其他的方法。
二維數(shù)組初始化
二維數(shù)組初始化也是在類型說明時(shí)給各下標(biāo)變量賦以初值。主要有兩種方式:
- 按行分段賦值
- 按行連續(xù)賦值
這兩種方式如下:
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};
這兩種賦初值的結(jié)果是完全相同的。
于是,上面的代碼可以改寫成這樣。
int main(void)
{
int i, j, s = 0;
int average;
int v[3];
int a[5][3]={{80, 75, 92}, {61, 65, 71}, {59, 63, 70}, {85, 87, 90}, {76, 77, 85}};
for(i = 0; i < 3; i++){
for(j = 0; j < 5; j++){
s += a[j][i];
}
v[i] = s / 5;
s = 0;
}
average = (v[0] + v[1] + v[2]) / 3;
printf("First:%d\nSecond:%d\nThird:%d\n",v[0],v[1],v[2]);
printf("Final Average:%d\n", average );
return 0;
}
執(zhí)行結(jié)果完全相同,只不過不需要輸入。
在對二維數(shù)組賦初值時(shí),我們還要注意幾點(diǎn):
-
可以只對部分元素賦初值,未賦初值的元素自動(dòng)取0值。
int a[3][3] = {{1}, {2}, {3}};
int a[3][3] = {{0, 1}, {0, 0, 2}, {3}};
這句話可以得到下面這兩個(gè)數(shù)組:
1 0 0
2 0 0
3 0 0
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};
- 數(shù)組是一種構(gòu)造類型的數(shù)據(jù)
二維數(shù)組可以看作是由一維數(shù)組的嵌套而構(gòu)成的。因此,一個(gè)二維數(shù)組也可以分解為多個(gè)一維數(shù)組。
如二維數(shù)組a[3][4],可分解為三個(gè)一維數(shù)組,其數(shù)組名分別為:
a[0]
a[1]
a[2]
這三個(gè)一維數(shù)組都有4個(gè)元素,例如:一維數(shù)組a[0]的元素為a[0][0],a[0][1],a[0][2],a[0][3]。
為什么是這么奇怪的數(shù)組名呢,其實(shí)是這樣,a[0]中保存的是a[0][0]的地址,那么其實(shí)就是a[0][0]~a[0][3]這4個(gè)元素組成的一維數(shù)組的第一塊空間的地址,那么它就是這個(gè)一維數(shù)組的數(shù)組名。
注意,a[0],a[1],a[2]不能當(dāng)作下標(biāo)變量使用,它們是數(shù)組名,不是一個(gè)單純的下標(biāo)變量。
我是天花板,讓我們一起在軟件開發(fā)中自我迭代。
如有任何問題,歡迎與我聯(lián)系。
上一篇:C語言從零開始(十四)-字符串處理
下一篇:C語言從零開始(十六)-指針1