C語言從零開始(十五)-二維數(shù)組

定義

二維數(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)常被使用)

如圖所示:

二維數(shù)組看做一個(gè)坐標(biāo)系

存儲(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é)果如下:

執(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 數(shù)組在程序設(shè)計(jì)中,為了處理方便, 把具有相同類型的若干變量按有序的形式組織起來。這些按序排列的同類數(shù)據(jù)元素的集合稱...
    朱森閱讀 4,285評論 2 13
  • 指針是C語言中廣泛使用的一種數(shù)據(jù)類型。 運(yùn)用指針編程是C語言最主要的風(fēng)格之一。利用指針變量可以表示各種數(shù)據(jù)結(jié)構(gòu); ...
    朱森閱讀 3,619評論 3 44
  • 謹(jǐn)記 每個(gè)人心中都有一片海,自己不揚(yáng)帆,沒人幫您啟航,久了就是一片死海。人生,就是一場自己與自己的較量:讓積極打敗...
    長風(fēng)留言閱讀 8,159評論 6 10
  • 一、框架 1、Mac系統(tǒng)及常用工具、進(jìn)制;C數(shù)據(jù)類型、常量變量、運(yùn)算符、表達(dá)式、格式化輸入輸出 2、關(guān)系運(yùn)算符、邏...
    師景福閱讀 858評論 0 2
  • 千百年來,“孟姜女哭長城”的愛情故事一直在民間廣為流傳。有人認(rèn)為孟姜女哭的是齊長城,有人認(rèn)為孟姜女哭的是秦長城,還...
    白玉蟬笈閱讀 1,930評論 0 1

友情鏈接更多精彩內(nèi)容