本文整理自經典入門書《Head First C》,涵蓋 C 語言從編譯執行、基本語法、控制流程、函式特性、字串處理、指標運算、結構與聯合、動態記憶體分配、進階函式應用到系統呼叫等核心概念,適合初學者建立完整知識框架,也可供進階開發者快速回顧。
使用 GCC 編譯單一原始檔:
gcc name.c -o name
執行產生的執行檔:
./name
或串聯指令一次完成編譯與執行:
gcc name.c -o name && ./name
sizeof 運算子sizeof 是編譯期運算子,回傳型別或變數佔用的位元組數:
sizeof(int) → 4sizeof("Turtles!") → 9(含 8 字元與結束字元 \0)puts() 輸出字串並自動換行,用法類似 printf() 但無格式化功能。
scanf() 讀取格式化輸入,務必限制寬度 以防緩衝區溢位:
char ex[20];
puts("輸入男友的名字:");
scanf("%19s", ex); // 最多讀 19 字元,留空間給 \0
printf("親愛的%s,我們分手吧。\n", ex);
char:字元(1 位元組)int:整數(通常 4 位元組)#include <stdio.h>
int main() {
int decks;
puts("輸入有幾副牌");
scanf("%i", &decks);
if (decks < 1) {
puts("無效的副數");
return 1; // 非零返回值表示錯誤
}
printf("一共有%i張牌\n", decks * 52);
return 0; // 0 代表成功
}
main() 回傳值的意義main() 必須回傳 int。作業系統透過此值判斷程式是否正常結束:0 表成功,非零表失敗。
C 語言中幾乎所有運算式皆有值,包含賦值運算式:
x = 4; // 運算式值為 4 y = x = 4; // 串聯賦值,x 與 y 皆設為 4
string 型別,改用 char 陣列,結尾以 \0 標記。"hello")存放於唯讀區,嘗試修改會導致總線錯誤。char str[] = "hello";printf()printf("%s 說計數是 %i", "阿星", 21);
每個 % 格式指示字必須對應一個引數。
atoi():字串轉整數標準庫函式,將數字字串轉為 int。
./ 的由來類 Unix 系統預設不搜尋當前目錄,除非目錄在 PATH 環境變數中,故需以 ./ 指定路徑。
索引代表「相對於陣列起始位置的位移量」,首元素位移為 0。
'a':單一字元常數(int 型別)"a":字串字面常數(char*,含 \0)=:賦值==:相等比較+=、-=:複合賦值++、--:遞增/遞減&&(邏輯 AND):左側為假則不評估右側||(邏輯 OR):左側為真則不評估右側!:邏輯非_Bool、true、false(實為 1/0)&、| vs &&、||&、|:位元 AND/OR,總是評估兩側&&、||:邏輯運算,具備短路特性位元運算常用於旗標操作:6 & 4 = 4(二進位 110 & 100 = 100)。
switch 限制for 語法糖所有迴圈具備三要素:初始化、條件判斷、更新。for 將三者集中:
for (int i = 1; i < 11; i++) {
printf("%i 個棗\n", i);
}
break 與 continuebreak:跳出最內層迴圈或 switch,無法跳出 ifcontinue:跳過本次迴圈剩餘部分,直接進入下一次判斷經典教訓:1990 年 AT&T 長途系統癱瘓,緣於開發者誤用 break 試圖跳出 if,導致診斷碼被略過。
void 函式仍可用 return可提前離開函式,編譯器可能發出警告。
指標儲存記憶體位址,用途:
函式接收的是引數的副本,若需修改原變數,必須傳遞位址:
void go_south_east(int *lat, int *lon) {
*lat -= 1; // 解參考修改原值
*lon += 1;
}
指標加 1 會依其基底型別大小移動位址:char* +1 位移 1 位元組,int* +1 位移 4 位元組。
char quote[] = "Cookie make you fat"; // quote 相當於 "e[0]
scanf() 緩衝區溢位風險與 fgets() 替代char food[5]; fgets(food, sizeof(food), stdin); // 安全讀取,含換行符
fgets 會保留換行符,且尺寸參數已含 \0 空間,無需像 scanf("%4s") 那樣手動減 1。
const 與字串字面常數const char *s = "read only"; // 編譯期防護:嘗試修改會報錯
string.h| 函式 | 功能 |
|---|---|
strlen | 回傳字串長度(不含 \0) |
strcpy | 複製字串 |
strcat | 串接字串 |
strcmp | 比較字串 |
strchr | 尋找字元 |
strstr | 尋找子字串 |
Linux/Mac 可用 man strstr 查閱手冊。
structstruct fish {
const char *name;
const char *species;
int teeth;
int age;
};
snappy.teeth 或 ptr->teethtypedef 簡化宣告:typedef struct { ... } fish_t;typedef 直接產生型別別名union所有成員共用同一記憶體空間,同一時間僅有一個成員有效:
typedef union {
short count;
float weight;
float volume;
} quantity;
需自行設計機制(如列舉)記錄目前儲存的型別。
enum定義一組具名常數:
enum colors { RED, GREEN, BLUE };
enum colors favorite = GREEN;
精確控制位元佈局,適用於硬體暫存器對應:
typedef struct {
unsigned int low_pass_vcf : 1;
unsigned int reverb : 1;
} synth;
彈性儲存可變數量資料,節點包含資料與指向下一節點的指標(遞迴結構)。
malloc(sizeof(Type)):分配記憶體,回傳 void*free(ptr):釋放記憶體strdup():複製字串並自動分配空間exit() 立即終止程式不執行清理動作,直接回傳狀態碼給作業系統。
void*:泛型指標,可指向任意型別#define:編譯期文字替換,可模擬可變參數函式system():啟動 Shell 執行指令,有安全風險(指令注入)exec() 系列:以新程式映像取代目前行程,PID 不變,避免 Shell 解析風險掌握上述知識點,即能應對絕大多數 C 語言開發場景。建議配合實作練習,深入體會指標運算、記憶體佈局與系統介面的運作機制。