C 語言看似簡單,實則暗藏玄機。本文梳理 14 個高頻核心知識點,涵蓋流、文件包含、宏與函數、字符串/內存操作、指針本質、NULL 語義、數組指針、標準庫優勢、本地化、程序退出機制等,助你夯實基本功,應對面試與實戰開發。
| # | 主題 | 核心結論 |
|---|---|---|
| 1 | 流的分類 | 文本流(解釋性、行長≤255字符)vs 二進制流(非解釋性、逐字節處理) |
| 2 | #include 文件類型 | 不限於 .h,可包含任意文本文件(如 .c, .inc),但規範建議僅含頭文件 |
| 3 | 宏 vs 函數選擇 | 小型、高頻、簡單代碼片段用宏(無調用開銷);複雜邏輯、多行代碼、追求代碼體積用函數 |
| 4 | strcpy vs memcpy | strcpy 專拷貝以 '\0' 結尾的字符串;memcpy 拷貝任意類型內存塊,需指定長度,不關心內容 |
| 5 | 空指針 vs void 指針 | 空指針:值為 NULL,不指向任何對象;void 指針:通用指針,指向具體對象但類型未知 |
| 6 | 空指針/void指針使用場景 | 空指針:遞歸終止、函數失敗返回、警戒值;void 指針:純內存操作、泛型接口傳遞未知類型指針 |
| 7 | NULL 定義與比較 | 定義為 0 或 (void*)0;NULL == 0 為真,但存儲表示不一定全 0 位模式(視架構) |
| 8 | 指針作 if 條件 | 判斷指針是否為空(非零即真);兩指針不可相加,只能相減得元素差 |
| 9 | void 函數與 return | 無返回值,通常可省略 return;錯誤處理需提前退出時必須顯式 return |
| 10 | exit() vs return | exit() 終止進程,控制權交還 OS;return 返回調用函數,僅結束當前函數 |
| 11 | 數組下標與越界訪問 | 下標從 0 開始;允許取 &arr[n](尾後地址),嚴禁解引用該地址 |
| 12 | arr vs &arr | arr 退化為首元素指針 (T*);&arr 為數組指針 (T(*)[N]),步長為整個數組大小 |
| 13 | 標準庫 vs 手寫函數 | 標準庫三大優勢:準確性(經測試驗證)、高效性(針對架構優化)、可移植性(跨平台一致行為) |
| 14 | 本地化環境 | 描述特定地區程序行為規則(字符集、貨幣、日期格式等),支撐國際化 (i18n) 關鍵 |
int *p1 = NULL; // 空指針:明確「無效」
void *p2 = malloc(100); // void 指針:持有內存,類型擦除
free(p2);
p2 = NULL; // 防野指針:釋放後立即置 NULL
// p2 現為空指針,非野指針
野指針成因: 釋放內存未置 NULL、棧內存逃逸(返回局部變量地址)、指針運算越界。防禦鐵律: 定義即初始化、釋放即置 NULL、嚴格邊界檢查。
arr 與 &arr 實戰差異int arr[5] = {1,2,3,4,5};
int *p1 = arr; // int*,+1 跳 4 字節
int (*p2)[5] = &arr; // int(*)[5],+1 跳 20 字節(整個數組)
printf("%p %p\n", p1+1, p2+1); // 地址差 16 字節
多維數組傳參時,void func(int (*p)[COL]) 保留列維度信息,編譯器可正確計算偏移,比 int** 更安全高效。
以 qsort 為例:內部實現通常為 Introsort(快速排序+堆排序+插入排序混合),平均 O(n log n),最壞 O(n log n),且經過極端案例測試。手寫排序極易在邊界條件、穩定性、性能上翻車。
這 14 點貫穿 C 語言核心類型系統、內存模型、編譯鏈接、運行時行為。建議:
基本功不牢,地動山搖。願每行 C 代碼都經得起推敲。