C 語言簡介
C 是一種 通用、靜態型別、編譯型、過程式導向 的程式語言。1972 年由 Dennis Ritchie 在貝爾實驗室為 Unix 作業系統開發而創建。它被譽為「系統程式設計語言之母」,影響了 C++、Java、C#、Go、Rust、Python、JavaScript 等幾乎所有現代語言。
為何值得學習 C?
- 計算機科學基石:作業系統、編譯器、資料庫、網路協議、嵌入式韌體核心多數用 C 實作。
- 理解電腦如何運作:記憶體佈局、指標、堆疊/堆、呼叫慣例、連結器、載入器——C 讓你直面硬體抽象層。
- 就業門檻與加分項:嵌入式、系統軟體、高效能計算、遊戲引擎、安全研究、編譯器開發等領域核心技能。
- 語言可移植性極強:同一份標準 C 代碼,重新編譯即可在 x86、ARM、RISC-V、DSP、GPU、超級電腦、單晶片運行。
零基礎自學路線圖(12 週計畫)
第 1-2 週:環境與基礎語法
- 安裝 VS Code + GCC (MinGW-w64/Linux) 或 CLion
- 理解編譯四階段:預處理 → 編譯 → 組譯 → 連結
- 變數、資料型別、運算子、控制流程、函數
- 每天寫 3-5 支小程式(計算器、猜數字、九九乘法表)
第 3-4 週:陣列、字串、指標入門
- 一維/多維陣列、字串以
\0 結束
- 指標核心:
& 取址、* 解參考、指標算術、指標與陣列關係
- 函數參數傳值 vs 模擬傳址
- 實作:字串反轉、陣列排序、簡易計算機
第 5-6 週:進階指標與記憶體管理
- 多層指標、函數指標、
const 與指標組合
- 動態記憶體:
malloc/calloc/realloc/free、記憶體洩漏、Valgrind 偵測
- 結構體、聯合體、列舉、位元欄位、記憶體對齊
- 實作:動態陣列、單向鏈結串列(增刪改查、反轉)
第 7-8 週:檔案 I/O、模組化、前處理器
- 檔案操作:
fopen/fread/fwrite/fseek/fclose、文字/二進位模式
- 多檔案專案:
.c/.h 分離、static 內部連結、標頭檔防重複包含
- 前處理器:巨集、條件編譯、
#error、#pragma
- 建構工具:Makefile 入門、CMake 基礎
- 實作:學生成績管理系統(檔案持久化、模組化架構)
第 9-10 週:資料結構與演算法 C 實作
- 棧、佇列、雙向鏈結串列、哈希表、二元樹、堆積、圖
- 排序:快速排序、合併排序、堆積排序、基數排序
- 查找:二分查找、哈希查找、二元搜尋樹
- LeetCode Easy/Medium 刷題(C 語言版)
第 11-12 週:系統程式入門與專案實戰
- 進程/執行緒:
fork/exec/wait、pthread、同步機制
- 網路程式:Socket API、TCP/UDP、I/O 多工
- 信號處理、管道、共享記憶體
- 完整專案:簡易 HTTP 伺服器、Shell、記憶體配置器、編譯器前端
必備工具鏈
| 類別 | 推薦工具 | 用途 |
| 編輯器/IDE | VS Code (C/C++ Extension)、CLion、Visual Studio、Neovim + LSP | 編碼、除錯、重構 |
| 編譯器 | GCC、Clang、MSVC | 支援 C17/C23、警告全開 -Wall -Wextra -pedantic |
| 建構系統 | CMake、Make、Meson | 跨平台建構、依賴管理 |
| 除錯器 | GDB、LLDB、Visual Studio Debugger | 斷點、觀察記憶體、堆疊追蹤 |
| 靜態分析 | Cppcheck、Clang Static Analyzer、Coverity | 編譯期發現 Bug、安全缺陷 |
| 動態分析 | Valgrind (Memcheck/Helgrind)、AddressSanitizer (ASan)、ThreadSanitizer (TSan) | 記憶體洩漏、緩衝區溢位、資料競爭 |
| 文檔查詢 | cppreference.com、man pages | 標準庫、語法、型別權威參考 |
避坑指南:新手必知的 10 大雷區
void main() → 標準寫 int main(void) 或 int main(int argc, char *argv[])
gets()、strcpy()、sprintf() → 禁用,改 fgets()、snprintf()、strncpy()
- 指標未初始化 → 宣告即
NULL
malloc 不檢查回傳值 → 必檢查
free 後不置 NULL → 野指標隱患
- 陣列越界、字串缺
\0 → 邊界檢查、strnlen
- 有號整數溢位 → 未定義行為,用無號或檢查
float 比較相等 → 用 epsilon 容差
- 忽略編譯警告 →
-Werror 視警告為錯誤
- 複製貼上不知來源代碼 → 必須理解每一行
推薦學習資源彙總
- 書籍:《C Primer Plus》、《C 指標詳解》、《C 專家程式設計》、《Unix 環境高階程式設計》
- 課程:CS50 (Harvard, edX)、MIT 6.087 (C 語言)、清華大學《程式設計》慕課
- 練習平台:LeetCode (C 標籤)、Codeforces、AtCoder、Project Euler、Exercism (C track)
- 閱讀代碼:Redis、SQLite、nginx、Linux 核心、musl libc、TinyCC
- 社群:Stack Overflow (c tag)、Reddit r/C_Programming、PTT C_C++ 版、技術部落格
給初學者的話
「C 語言不難,難的是堅持。每天寫代碼、讀代碼、想原理。三個月後,你會擁有『看透軟體本質』的 X 光眼。」