陣列是 C 語言最基礎的聚合資料類型。本文系統整理一維/多維陣列宣告、初始化、記憶體佈局、指標退化、字串陣列特性、函式參數傳遞、冒泡排序實作等核心知識點,附帶可編譯執行的完整範例。
int ary[10] = {0, 1, 2, 3, 4}; // 前5個初始化,其餘自動為0
int ary2[] = {1,2,3,4,5}; // 省略長度,編譯器推導為5
// 修改元素
ary[8] = 0;
// 遍歷
int count = sizeof(ary) / sizeof(int);
for (int i=0; i
關鍵:陣列名 ary 等價於 &ary[0](首元素位址),但 sizeof(ary) 返回整個陣列位元組數。
二維陣列
int ary2[3][2] = { {1,2}, {3,4}, {5,6} };
// 等價初始化
int ary2[3][2] = { 1,2,3,4,5,6 }; // 按行優先順序
int ary2[][2] = { 1,2,3,4,5,6 }; // 可省略行數,列數必須給定
// 遍歷
for (int i=0; i<3; i++)
for (int j=0; j<2; j++)
int x = ary2[i][j];
字串陣列特性
char str1[] = { 'i',' ','a','m' }; // 長度4,無\0
char str2[] = "i am"; // 長度4,含\0,sizeof=5
char str3[10] = "i am"; // 長度10,前4字元有效,其餘\0
// strlen(str2)=4, sizeof(str2)=5
// 傳遞給函式時退化為 char*,sizeof 變為指標大小
陣列作為函式參數:退化為指標
void bubble_sort(int ary[], int len) { // 等價於 int *ary
for (int i=0; i ary[j+1]) {
int t = ary[j]; ary[j] = ary[j+1]; ary[j+1] = t;
sorted = 0;
}
if (sorted) break;
}
}
// 呼叫
int nums[] = {14, 80, 19, 6, 26, 2};
bubble_sort(nums, 6); // 實際傳遞首元素位址
鐵律:函式內 sizeof(ary) 返回指標大小 (4/8),無法 取得原陣列長度,必須額外傳遞 len。
C99 變長陣列 (VLA)
void func(int n) {
int vla[n]; // 合法於 C99,棧上動態配置
// 注意:大型 VLA 易導致棧溢位
}
指標與陣列的等價與差異
int *p = ary; 合法,p 可修改指向
ary = p; 非法,陣列名是常量指標
p[i] 等價 *(p+i) 等價 ary[i]
sizeof(p) ≠ sizeof(ary)
冒泡排序完整可執行範例
#include <stdio.h>
void bubble_sort(int *ary, int len) {
for (int i=0; i ary[j+1]) {
int t = ary[j]; ary[j] = ary[j+1]; ary[j+1] = t;
sorted = 0;
}
if (sorted) break;
}
}
int main() {
int nums[] = {14, 80, 19, 6, 26, 2};
int n = sizeof(nums)/sizeof(nums[0]);
bubble_sort(nums, n);
for (int i=0; i
陣列看似簡單,但「退化為指標」、「sizeof 語意」、「多維陣列記憶體連續佈局」等細節決定了 C 語言程式的正確性與效能。