一維數組
類型 變量名[長度];
- 元素類型任意:
int/float/char/pointer/struct/union。
- 下標從 0 開始:
int a[10] → a[0]~a[9]。
- 字符串用字符數組:
char str[8] = "hello"; → str[0]='h'...str[4]='o', str[5]='\0'。
Turbo C 無邊界檢查
char s1[5], s2[6];
strcpy(s1, "ABCDEFG"); // 只複製 "ABCDE",'F' 溢出進入 s2 區域!
- 程序員自負責邊界,建議用
strncpy/snprintf。
多維數組
類型 數組名[第N維][第N-1維]...[第1維];
- 聲明順序與 C/C++ 相反(BASIC/Fortran 習慣)。
- 示例:
int m[3][2] → 3 行 2 列,共 6 元素。
- 內存順序:行主序,最右維變化最快。
m[0][0], m[0][1], m[1][0], m[1][1], m[2][0], m[2][1]
- 三維示例:
char c[2][2][3] → 12 元素,順序 c[0][0][0]..c[0][0][2], c[0][1][0]..c[1][1][2]。
內存佔用計算
字節數 = 維1長度 * 維2長度 * ... * 維N長度 * 元素類型字節數
數組初始化
規則
- 外部/靜態數組可初始化,自動數組 C99 前不允許(現代編譯器支持)。
- 初始化列表用
{} 包裹,行用 {},逗號分隔,總體再包一層 {}。
- 多維數組按行主序填充,可攤平為一維列表:
int x[2][3] = {1,2,3,4,5,6};。
- 初始化項少於元素數,剩餘自動填 0。
- 指針數組初始化可省略長度:
char *f[] = {'a','b','c'}; → 3 元素。
示例
// 二維數組完整初始化
int p[2][3] = {{2, -9, 0}, {8, 2, -5}};
int m[2][4] = {{27, -5, 19, 3}, {1, 8, -14, -2}};
// 攤平初始化
int x[2][3] = {1, 2, 3, 4, 5, 6};
// 部分初始化,餘下補 0
int a[5] = {1, 2}; // a = {1,2,0,0,0}
// 指針數組
char *f[] = {'A', 'B', 'C'}; // f[0]->'A', f[1]->'B', f[2]->'C'
總結
- 一維數組:
type name[len],下標 0 起,字符串留 \0 位。
- 無邊界檢查,溢出鄰近內存,極度危險。
- 多維數組:聲明維度順序反直覺,內存行主序,最右維最快。
- 初始化:
{} 套 {},可攤平,不足補 0,指針數組可推導長度。