發信人: ax.bbs@bbs.ee.nthu.edu.tw. (athena), 信區: test
標  題: 星星流講座 0035
發信站: ☆清華電機☆ (Thu Jul  6 21:41:10 1995)
轉信站: star

星星流講座 0035         C 語言教室

第 5 講 之 11           陣列與指標
                        Topic: Multi-dimensional array

C 語言支援多維陣列,它的宣告方式很簡單,例如我們要宣告一個
2x2 的整數陣列:

        int a[2][2];

更高維數的依此類推:

        int b[3][3][3];

請注意多維陣列在 C 中是以 a[1][2] 這種形式出現,和其他高階語言常見
的 a(1,2) 或 a[1,2] 不同,這是容易犯錯的地方。

C 語言以 row major 的方式來處理多維陣列,亦即

        int a[2][2];    /* [row][column] */

多維陣列和指標陣列在資料的存放上有很大的不同,例如:

        char *name[] = {"Susan", "Elizabeth", "Jay"};
     char name[][10] = {"Susan", "Elizabeth", "Jay"};


上面的例子中,我們並沒有給定第一維的維數,這是因為第一維的維數不
必給,compiler 會自己替你決定,但是第二維以後的維數你必須自己指定。
同樣的情形也發生在把多維陣列當做函數的參數傳遞上,例如:

        foo (a[][10]);

必須指定第二維以後的維數,否則將發生錯誤。為什麼?我們先賣
個關子。先來看看 *name[] 的存放方式和 name[][10] 有什麼不同,請看下圖:
 


        *name[]

                ┌┐  +-------+
                │┼→|Susan\0|
                ├┤  +-------+---+
                │┼→|Elizabeth\0|
                ├┤  +-----+-----+
                │┼→|Jay\0|
                └┘  +-----+

        name[][10]

        +-----------------------------------+
        |Susan\0     Elizabeth\0 Jay\0      |
        +-----------------------------------+
         0           10          20


我們可以看到 name[][10] 是配置了 3 * 10 = 30 的空間,然後把二維陣列
轉換成一維陣列儲存,這也就是 C 語言對付多維陣列的方法:把它轉化為一
維陣列存放。因此,如果你在傳遞多維陣列時不給定第二維以後的維數的話,
compiler 就不能正確的計算陣列中各個元素存放的位置,因此會發生錯誤

由上面的圖形我們可以很明顯的區分 *name[] 和 name[][10] 的差別,一般
而言以 *name[] 這種形式來存放資料是比較省空間的,但這並不絕對。

--
本文原作者為徐振家,原作刊載於星星神教總壇 ☆清華電機☆ test 板。
你可以以電子文件的形式將本文自由流傳於台灣學術網路,但必須包含此版權聲明。
原作者依中華民國著作權法之規定,享有本文之著作權,請勿抄襲以免觸法。
未經授權任何人不得以任何形式對本文做任何修改及商業上之應用。
其他網路的轉載或其他用途的應用,請先知會作者,並取得其同意。
對本文有任何疑問或意見請 mail 給 ax.bbs@bbs.ee.nthu.edu.tw,謝謝。