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

定義

二維數組定義的一般形式是:

類型說明符 數組名[常量1][常量2]
  • 常量1:第一維下標的長度

  • 常量2:第二維下標的長度

    int a[3][4];
    

這個二維數組表示一個三行四列的整形變量集合,數組名為a,下標變量的類型為整型。該數組的下標變量共有3×4個,即:

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軸向右遞增,y軸向下遞增。(在計算機UI設計中,這種二維坐標系經常被使用)

如圖所示:

二維數組看做一個坐標系

存儲形式

在內存中,二維數組被保存成一段連續的內存空間。就如同一個一維數組,二維數組也是按一維線性排列的。

具體的存儲方式有兩種:

  • 按行排列

放完一行之后順次放入第二行。

  • 按列排列

放完一列之后再順次放入第二列。

我們再回頭看一下這個二維數組:

 int a[3][4];

其實,在內存中它的存儲方式相當于:

 int  b[12];

只不過,計算機把它分成了三個部分。

a[0][0] 對應于 b[0]
a[1][0] 對應于 b[4]
a[3][0] 對應于 b[8]

二維數組元素的引用

二維數組的元素也稱為雙下標變量,其表示的形式為:

數組名[下標][下標]

其中下標應為整型常量或整型表達式。例如:

a[0][2]

表示數組a第一行第三列的元素。

在講一維數組時,很多人反饋說無法區分數組定義和引用時方括號中的內容,今天我們來說一下這兩處用法的區別:

  • 數組聲明的方括號中的是某一維的長度,即數組下標最大值 + 1
  • 數組引用中的下標是該元素在數組中的位置標識
  • 前者只能是常量,而后者可以是常量,變量或表達式。

下面我們通過一個具體的例子來講解。

一個學習小組有5個人(A, B, C, D, E),三次考試每個人的成績如下。請編程實現計算這個小組所有人三次考試的平均成績。

考試成績

我們用一個二維數組a[5][3]存放五個人三次考試的成績。再用一個一維數組v[3]存放所求得每次考試的平均成績,最后求出v中三個成績的平均值。代碼如下:

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;
}

執行結果如下:

執行結果

大家應該都注意到了,我們通過scanf函數從鍵盤一個個錄入每個成績保存在二維數組中,這種方法太繁瑣。每次調試都需要輸入這15個數字,肯定沒人愿意。接下來我們看看有沒有其他的方法。

二維數組初始化

二維數組初始化也是在類型說明時給各下標變量賦以初值。主要有兩種方式:

  • 按行分段賦值
  • 按行連續賦值

這兩種方式如下:

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};

這兩種賦初值的結果是完全相同的。

于是,上面的代碼可以改寫成這樣。

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;
}

執行結果完全相同,只不過不需要輸入。

在對二維數組賦初值時,我們還要注意幾點:

  • 可以只對部分元素賦初值,未賦初值的元素自動取0值。

    int a[3][3] = {{1}, {2}, {3}};
    int a[3][3] = {{0, 1}, {0, 0, 2}, {3}};

這句話可以得到下面這兩個數組:

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};
  • 數組是一種構造類型的數據

二維數組可以看作是由一維數組的嵌套而構成的。因此,一個二維數組也可以分解為多個一維數組。

如二維數組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[0][0]的地址,那么其實就是a[0][0]~a[0][3]這4個元素組成的一維數組的第一塊空間的地址,那么它就是這個一維數組的數組名。

注意,a[0],a[1],a[2]不能當作下標變量使用,它們是數組名,不是一個單純的下標變量。

我是天花板,讓我們一起在軟件開發中自我迭代。
如有任何問題,歡迎與我聯系。


上一篇:C語言從零開始(十四)-字符串處理
下一篇:C語言從零開始(十六)-指針1

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,923評論 6 535
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,740評論 3 420
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,856評論 0 380
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,175評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,931評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,321評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,383評論 3 443
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,533評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,082評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,891評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,067評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,618評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,319評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,732評論 0 27
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,987評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,794評論 3 394
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,076評論 2 375

推薦閱讀更多精彩內容

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