發信人: 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,謝謝。