一、C 語言概述
1. 誕生歷程
- 1972 年貝爾實驗室 D.M.Ritchie 基於 B 語言設計,取 BCPL 第二字母命名為 C。
- 1978 年《The C Programming Language》出版,ANSI/ISO 標準化(C89/C90、C99、C11、C17)。
- 現代編譯器多以 ANSI C 為基礎擴展。
2. 語言特點
- 可移植性強,跨平台運行。
- 語法簡潔靈活,可直接訪問硬件。
- 執行效率高,接近匯編。
3. 嵌入式開發中使用 C 的原因
- 內核多為 C 實現,驅動開發需與內核交互。
- 直接操作硬件寄存器、內存映射。
- 匯編雖快但難實現複雜邏輯(如循環),通常僅用於初始化。
二、數據類型體系
1. 分類
- 基本類型:void、字符型(char)、數值型(整型 short/int/long、實型 float/double)。
- 構造類型:數組、結構體、聯合體、枚舉、指針。
2. 常見編譯器類型大小(GCC x86 為例)
| 類型 | 字節數 |
| char | 1 |
| short | 2 |
| int/long/float | 4 |
| double | 8 |
指針大小由 OS 決定:32 位 4 字節,64 位 8 字節。
3. 變量三大屬性
- 數據類型:決定佔用空間大小。
- 作用域:可見性範圍(局部/全局/文件)。
- 存儲類型:內存佈局與生存期(auto/static/extern/register)。
4. 聲明 vs 定義
- 定義:分配內存,僅一次(
int a;)。
- 聲明:告知編譯器已存在,不分配內存(
extern int a;)。
- 定義性聲明(分配空間)vs 引用性聲明(跨文件引用)。
5. 內存區域劃分
棧區:局部變量、參數、自動變量(先進後出,系統管理)
堆區:malloc/realloc/calloc 分配(先進先出,用戶管理)
數據段:
.bss 未初始化全局/靜態變量
.rodata 常量、字符串字面量
.data 初始化全局/靜態變量
代碼段:指令、只讀數據
6. 全局 vs 局部變量對比
| 全局/靜態 | 局部 |
| 存放 | .data/.bss | 棧 |
| 默認初始化 | 是(0/NULL) | 否(隨機值) |
| 釋放時機 | 程序結束 | 函數返回 |
| 作用域 | 全局/文件 | 塊級 |
static 修飾局部變量:僅初始化一次,生存期全程,作用域仍局部。修飾全局:限制文件內可見。
7. 右左法則讀懂複雜聲明
從變量名出發,先右後左,遇括號反向:
int *a[10]:a 是數組 → 元素是指針 → 指向 int
int (*a)[10]:a 是指針 → 指向數組 → 元素是 int
int *(*a)(int):a 是指針 → 指向函數(參數 int) → 返回指針 → 指向 int
8. sizeof vs strlen
sizeof:編譯期運算符,得類型/表達式佔用字節數。類型須加括號,變量可不加。
strlen:運行期函數,從地址掃描至首個 \0,返回字符數(不含 \0)。