C語言中文網 目錄

二維數組的定義、初始化和輸出,C語言二維數組詳解

本節學習二維數組。二維數組與一維數組相似,但是用法上要比一維數組復雜一點。后面的編程中,二維數組用得很少,因為二維數組的本質就是一維數組,只不過形式上是二維的。能用二維數組解決的問題用一維數組也能解決。但是在某些情況下,比如矩陣,對于程序員來說使用二維數組會更形象直觀,但對于計算機而言與一維數組是一樣的。

二維數組的定義

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

類型說明符 數組名[ 常量表達式][ 常量表達式];

比如:
int a[3][4];
表示定義了一個 3×4,即 3 行 4 列總共有 12 個元素的數組 a。這 12 個元素的名字依次是: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]。

與一維數組一樣,行序號和列序號的下標都是從 0 開始的。元素 a[i][j] 表示第 i+1 行、第 j+1 列的元素。數組 int a[m][n] 最大范圍處的元素是 a[m–1][n–1]。所以在引用數組元素時應該注意,下標值應在定義的數組大小的范圍內。

此外,與一維數組一樣,定義數組時用到的“數組名[常量表達式][常量表達式]”和引用數組元素時用到的“數組名[下標][下標]”是有區別的。前者是定義一個數組,以及該數組的維數和各維的大小。而后者僅僅是元素的下標,像坐標一樣,對應一個具體的元素。

C 語言對二維數組采用這樣的定義方式,使得二維數組可被看作一種特殊的一維數組,即它的元素為一維數組。比如“int a[3][4];”可以看作有三個元素,每個元素都為一個長度為 4 的一維數組。而且 a[0]、a[2]、a[3] 分別是這三個一維數組的數組名。下面來驗證一下看看是不是這么回事兒:
# include <stdio.h>
int main(void)
{
    int a[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
    printf("%d\n", sizeof(a[0]));
    return 0;
}
輸出結果是:
16

可見 a[0] 確實是第一行一維數組的數組名,其他同理。

在 C 語言中,二維數組中元素排列的順序是按行存放的,即在內存中先順序存放第一行的元素,再存放第二行的元素,這樣依次存放。

二維數組的初始化

可以用下面的方法對二維數組進行初始化。

1) 分行給二維數組賦初值,比如上面程序的賦值方法:
int a[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
這種賦初值的方法比較直觀,將第一個花括號內的數據賦給第一行的元素、第二個花括號內的數據賦給第二行的元素……即每行看作一個元素,按行賦初值。

2) 也可以將所有數據寫在一個花括號內,按數組排列的順序對各元素賦初值。比如:
int a[3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
效果與第 1 種是一樣的。但第1種方法更好,一行對一行,界限清楚。第 2 種方法如果數據多,寫成一大片,容易遺漏,也不易檢查。

3) 也可以只對部分元素賦初值。比如:
int a[3][4] = {{1, 2}, {5}, {9}};
它的作用是對第一行的前兩個元素賦值、第二行和第三行的第一個元素賦值。其余元素自動為 0。初始化后數組各元素為:


 
4) 如果在定義數組時就對全部元素賦初值,即完全初始化,則第一維的長度可以不指定,但第二維的長度不能省。比如:
int a[3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
等價于:
int a[][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
系統會根據數據總數和第二維的長度算出第一維的長度。但這種省略的寫法幾乎不用,因為可讀性差。

5) int a[3][4]={0};

二維數組“清零”,里面每一個元素都是零。

二維數組如何輸出

二維數組有行和列,那么如何輸出里面的元素呢?在講述一維數組的時候說過,“數組的元素只能一個一個輸出”,二維數組也不例外。在一維數組中是用一個 for 循環進行輸出,而二維數組元素的輸出要使用兩個 for 循環嵌套。
# include <stdio.h>
int main(void)
{
    int a[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
    int i;  //行循環變量
    int j;  //列循環變量
    for (i=0; i<3; ++i)
    {
        for (j=0; j<4; ++j)
        {
            printf("%-2d\x20", a[i][j]);
        }
        printf("\n");
    }
    return 0;
}
輸出結果是:
1  2  3  4
5  6  7  8
9  10 11 12

提示:“printf("%-2d\x20",a[i][j]);”中的“%-2d”,其中“-”表示左對齊,如果不寫“-”則默認表示右對齊;“2”表示這個元素輸出時占兩個空格的空間,所以連同后面的 \x20 則每個元素輸出時都占三個空格的空間。

精美而實用的網站,提供C語言C++STLLinuxShellJavaGo語言等教程,以及socketGCCviSwing設計模式JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo