C語言作為計算機系統基石,其知識點繁雜且深度十足。本文系統梳理從基礎語法、數據類型、控制流、數組指針、函數、結構體、鏈表、枚舉到內存模型的完整知識體系,每節包含核心概念、語法規則、易錯點、最佳實踐,適合面試複習、查漏補缺、工程查閱。
基本類型大小(32位系統典型值):
| 類型 | 大小 | 範圍/精度 | 格式符 |
|---|---|---|---|
| char | 1B | -128~127 | %c/%hhd |
| short | 2B | -32768~32767 | %hd |
| int | 4B | -2^31~2^31-1 | %d |
| long | 4B/8B | 平台相關 | %ld |
| float | 4B | 7位有效數字 | %f/%e/%g |
| double | 8B | 15-16位有效數字 | %lf/%e/%g |
| 指針 | 4B/8B | 地址空間 | %p |
進制表示:八進制0前綴、十六進制0x前綴
補碼表示:原碼→反碼(符號位不變,其餘取反)→補碼(反碼+1)
printf格式符核心:
%d/%ld:有符號十進制,%m.n寬度.精度,%-左對齊,%0零填充%o/%x/%X:八/十六進制%u:無符號十進制%c/%s:字符/字符串%f/%e/%g:浮點(定點/科學/通用)%%:輸出%scanf注意事項:地址傳遞&var、%*d跳過輸入、無精度控制、scanf_s需指定緩衝區大小
9種控制語句:if-else、switch-case、for、while、do-while、break、continue、goto、return
三大基本結構:順序、選擇、循環
條件運算符:expr1 ? expr2 : expr3
數組特性:靜態定義、下標從0開始、二維數組行主序存儲、部分初始化餘位補0
字符串本質:字符數組以\0結尾、"abc"含隱式\0、'a'vs"a"區別
常用字符串函數:strlen/strcpy/strcat/strcmp/strchr/strstr、sprintf/sscanf格式化、大小寫轉換
參數傳遞:值傳遞(單向)、數組名傳遞實為指針(可修改原數組)
存儲類別完整對比:
| 類別 | 關鍵字 | 作用域 | 生存期 | 存儲區 | 默認值 |
|---|---|---|---|---|---|
| 自動 | auto | 塊內 | 塊執行期間 | 棧 | 垃圾值 |
| 靜態局部 | static | 塊內 | 程序全期 | 靜態區 | 0 |
| 寄存器 | register | 塊內 | 塊執行期間 | 寄存器/棧 | 垃圾值 |
| 外部全局 | extern | 全程序(多文件) | 程序全期 | 靜態區 | 0 |
| 內部全局 | static | 當前文件 | 程序全期 | 靜態區 | 0 |
遞歸:直接/間接自我調用、需基準情況、棧溢出風險
核心概念:指針=地址、指針變量=存地址的變量、&取址、*解引用
指針運算:p+1按sizeof(*p)步進、p++移動到下一元素
數組與指針:a[i] ≡ *(a+i)、數組名退化為首元素指針、&a類型為int(*)[N]
二維數組指針:int (*p)[N]指向行、int *p[N]指針數組
字符串指針:char *p = "str"指向常量區、不可修改、char p[] = "str"棧上可修改
結構體定義:struct Tag { members; };、變量定義struct Tag var;
指針訪問:p->member ≡ (*p).member、->優先級高
函數傳遞:值傳遞(拷貝整個結構)、指針傳遞(高效、可修改)
鏈表節點:struct Node { Data data; struct Node *next; };、動態分配、遍歷/插入/刪除
特性:本質是整數常量、不可修改、可比較、switch適用
第十章:預處理與編譯流程
預處理指令:
#define宏定義、#include文件包含、#ifdef/#ifndef/#endif條件編譯、#pragma編譯器指示編譯四階段:預處理(.i)→編譯(.s)→汇編(.o)→鏈接(可執行文件)
第十一章:標準庫精選
<stdlib.h>:malloc/free/abs/atoi/qsort/bsearch<string.h>:strlen/strcpy/strcat/strcmp/memcpy/memset<math.h>:sin/cos/sqrt/pow/log<time.h>:time/clock/difftime/strftime<ctype.h>:isalpha/isdigit/toupper/tolower常見UB:有符號溢出、空指針解引用、數組越界、使用未初始化值、重複釋放、嚴格別名違規、修改字符串常量
防禦性編程:
-Wall -Wextra -Werror -fsanitize=undefined,addressassert(ptr != NULL)if (idx >= 0 && idx < len)int x = 0; char *p = NULL;free(p); p = NULL;break/run/next/step/print/watch/bt--leak-check=full --track-origins=yes-fsanitize=address,undefined,leakperf record -g ./prog && perf report這份筆記提煉了C語言工程實踐中最高頻、最高價、最易錯的核心知識點。建議結合《C專家編程》、《C陷阱與缺陷》、《現代C語言編程》等經典著作深入研讀,並在實際項目中刻意練習指針操作、內存管理、並發控制等硬核技能。C語言學無止境,精進在堅持。