C語言核心
├─ 程序結構:main、預處理、編譯鏈接
├─ 類型系統:基本類型、派生類型(數組/指針/結構體/聯合/枚舉)
├─ 內存模型:五區、存儲類別、對齊、動態分配
├─ 控制流:語句、分支、循環、跳轉
├─ 函數機制:定義/聲明/調用、參數傳遞、遞歸、函數指針
├─ 模塊化:多文件、頭文件、靜態/外部鏈接、make/CMake
├─ 標準庫:IO、字符串、數學、時間、斷言、錯誤處理
└─ 進階主題:位運算、可變參數、內聯彙編、嵌入式/系統編程
#include // 引入標準 IO 庫頭文件
int main(void) { // 程序入口,返回 int
printf("Hello, C\n"); // 格式化輸出
return 0; // 0 表示成功
}
#include:預處理指令,展開頭文件內容。stdio.h:Standard Input Output,提供 `printf/scanf/FILE` 等。main:唯一入口,宿主環境調用,返回值傳遞給作業系統。| 類別 | 關鍵字 | 典型大小(64位) | 格式符 | 範圍/精度 |
|---|---|---|---|---|
| 字符 | char | 1B | %c | -128~127 或 0~255 |
| 整數 | short/int/long/long long | 2/4/8/8B | %hd/%d/%ld/%lld | 有符號/無符號 |
| 浮點 | float/double/long double | 4/8/16B | %f/%lf/%Lf | 7/15/19 有效位 |
| 布爾 | _Bool (stdbool.h: bool) | 1B | %d | 0/1 |
| 無類型 | void | - | - | 函數無返、通用指針 |
關鍵點:`sizeof` 編譯期常量;`signed/unsigned` 修飾整數;變量定義 = 聲明 + 分配內存 + 可選初始化。
struct Student {
int id;
char name[20];
float score;
struct Date { int y,m,d; } birthday; // 嵌套
};
struct Student s = {1, "Tom", 90.5, {2000,5,1}};
s.score = 95; // 成員訪問
struct Student *ps = &s;
ps->name[0] = 'J'; // 指針訪問
結構體大小 = 成員大小和 + 填充。`#pragma pack(n)` 控制對齊,`offsetof` 獲取偏移。
| 類型 | 示例 |
|---|---|
| 無參無返 | void hello(void) |
| 無參有返 | int get_val(void) |
| 有參無返 | void set_val(int x) |
| 有參有返 | int add(int a,int b) |
形參修改不影響實參。需修改實參 → 傳指針。數組退化為指針傳遞。
// add.h
int add(int a, int b);
// add.c
int add(int a, int b) { return a+b; }
// main.c
#include "add.h"
FILE *fp = fopen("data.txt", "r"); // 打開,模式: r/w/a/r+/w+/a+
if (!fp) { perror("fopen"); return 1; }
// 文本模式
fprintf(fp, "%d %s\n", 42, "hello"); // 格式化寫
fscanf(fp, "%d %s", &x, buf); // 格式化讀
fgets(buf, sizeof(buf), fp); // 讀整行
fputs(buf, fp); // 寫字符串
// 二進制模式
fwrite(buf, sizeof(int), n, fp); // 批量寫
fread(buf, sizeof(int), n, fp); // 批量讀
// 定位
fseek(fp, 0, SEEK_END); // 移至末尾
long pos = ftell(fp); // 獲取位置
rewind(fp); // 回開頭
fclose(fp); // 必須關閉,刷新緩衝區
| 模式 | 含義 | 文件不存在 | 文件存在 | 可讀/可寫 |
|---|---|---|---|---|
| `r` | 只讀 | 失敗 | 打開 | R/- |
| `w` | 只寫 | 創建 | 截斷(清空) | - /W |
| `a` | 追加 | 創建 | 打開,指針在末尾 | - /W |
| `r+` | 讀寫 | 失敗 | 打開 | R/W |
| `w+` | 讀寫 | 創建 | 截斷 | R/W |
| `a+` | 讀追加 | 創建 | 打開,指針末尾 | R/W |
二進制模式加 `b`:`rb`、`wb` 等,Windows 關鍵(抑制 `\n`↔`\r\n` 轉換)。
#define 宏:對象宏/函數宏,參數加括號,整體加括號。#include:`< >` 系統路徑,`" "` 當前目錄優先。#ifdef/#ifndef/#endif:條件編譯,防止重複包含。語法基礎 → 內存模型指針 → 數據結構封裝 → 標準庫熟練
↓ ↓ ↓ ↓
預處理/編譯鏈接 → 調試/靜態分析 → 模塊化設計 → 性能調優/移植
↓ ↓ ↓ ↓
嵌入式/系統級開發 ← 操作系統內核 ← 編譯器/運行時 ← 高性能計算
C 語言小而美,核心概念有限但組合威力無窮。建議學習路徑:語法速通 → 指針/內存深度實踐 → 數據結構手寫庫 → 多文件項目 → 系統編程(APUE/UNIX網絡編程) → 內核/編譯器/虛擬機。