C 语言教程 —— 学会 C 语言,构建自我 C 语言体系
写在教程之前
本教程的目标是从零开始(手把手教会搭建环境)到精通 C 语言, 构建自己的 C 语言知识体系。
真正的工程师经验来自项目堆砌和自我踩坑, 而不是靠教程学习。师傅领进门, 修行靠个人。
本教程的核心理念:
- 面向底层 — C 语言是距离硬件最近的高级语言。本教程大量涉及汇编层面、内存布局、指针本质、系统调用等底层话题。每个关键概念都会从”CPU 看到了什么”的角度进行剖析。
- 向上延伸 — C 语言是 C++ 的基石。理解 C 的指针、内存管理、结构体后, 再学 C++ 的 this 指针、虚表、智能指针会豁然开朗。教程在合适位置提供指向 CPP教程 的链接。
- 视野开阔 — 本教程第四部分”内核”将读者引入操作系统内核的世界, 理解 C 语言在系统工程中的核心地位。同时, 数据结构部分与根 DSA学习路线 配合, 从底层内存布局理解每种数据结构的本质。
- 系统化思考 — 希望读者带着辩论态度阅读。题目和概念交错排布, 题目的目的就是启发思考。如果发现题目不会, 回去重新想想。
- 善用工具 — 不反对也不鼓吹 AI。自我思考是第一要务, AI 辅助。推荐读者旁边开着 AI, 遇到不懂的问题先自己对 AI 解释看法让其纠正。
C 语言教程结构
c语言教程/
├── c目录.md ← 你在这里
├── 1入门/ 零基础起步: 环境搭建 → 语法基础 (10 章)
├── 2深化/ 底层视角: 指针, 内存, 汇编, OOP-in-C (9 章)
└── 库大全/ C 标准库 + 第三方库 分类索引
│ ├── 容器类库/ 动态数组/链表/栈/队列/哈希表/树/图
│ ├── 功能类库/ stdio/stdlib/string/math/time/调试/控制流
│ └── 第三方库/ 数据结构/网络/加密/压缩/数据库/JSON/GUI/测试/并发
推荐学习路线
1入门(01→10) → 2深化(01→09) → 库大全(按需查阅) → 根数据结构与算法技巧
| | |
▼ ▼ ▼
环境+语法 内存+指针 标准库+第三方库
同时, 建议在学习 C 的过程中关注 CPP教程 的对应章节, 理解 C 和 C++ 在设计理念上的差异与联系。
第一部分: 1入门/ — 从零开始
| # | 章节 | 核心内容 |
|---|
| 01 | 01_环境配置 | GCC/Clang 安装, 不同系统配置, Makefile/CMake 入门, GDB 调试 |
| 02 | 02_第一个C程序 | main 函数, printf, 编译四步骤, 返回值, 注释 |
| 03 | 03_变量与数据类型 | int/float/char, signed/unsigned, 类型转换, 常量, 作用域 |
| 04 | 04_运算符与表达式 | 算术/关系/逻辑/位运算, 优先级, 三目运算符, sizeof |
| 05 | 05_条件语句 | if/else/switch, 短路求值, 常见陷阱 |
| 06 | 06_循环结构 | for/while/do-while, break/continue, 循环优化 |
| 07 | 07_函数 | 声明/定义, 参数传递, 递归, 作用域, static 函数 |
| 08 | 08_数组 | 一维/多维数组, 变长数组, 越界问题, 数组与指针初步 |
| 09 | 09_字符串 | C 风格字符串, 字符数组, string.h 函数族, 格式化输入输出 |
| 10 | 10_结构体与联合体 | struct/union/enum, typedef, 内存对齐, 位域 |
第二部分: 2深化/ — 底层视角
核心理念: C 语言的真正力量在于让你看到”铁皮之下的东西”。第二部分从内存、汇编、硬件的角度重新审视 C 语言每个特性。
| # | 章节 | 核心内容 |
|---|
| 01 | 01_指针深度剖析 | 指针本质, 多级指针, const 指针, void*, 指针运算, 数组与指针 |
| 02 | 02_内存模型与布局 | 虚拟地址空间, .text/.data/.bss/堆/栈, 内存对齐, 端序 |
| 03 | 03_动态内存管理 | malloc/free/realloc/calloc, 内存泄漏, valgrind, 内存池 |
| 04 | 04_函数指针与回调 | 函数指针, 回调机制, qsort, 信号处理, 函数指针数组 |
| 05 | 05_位运算与硬件操作 | 位域, 掩码, volatile, 内存映射 IO, 内联汇编 |
| 06 | 06_编译链接与ELF | 预处理/编译/汇编/链接, ELF 格式, 符号表, 动态/静态链接 |
| 07 | 07_面向对象C编程 | 用 C 实现封装/继承/多态, 虚函数表手写, 内核 OOP 实践 |
| 08 | 08_标准库深度 | stdio/stdlib/string 底层实现, 缓冲区机制, 系统调用关系 |
| 09 | 09_多文件与模块化 | .h/.c 分离, static/extern, Makefile, 链接器脚本基础 |
C 与 C++ 的交叉学习
| C 深化章节 | 建议同步阅读的 C++ 内容 |
|---|
01_指针深度剖析 | [[../ISSUES |
03_动态内存管理 | [[../ISSUES |
07_面向对象C编程 | [[../ISSUES |
08_标准库深度 | [[../ISSUES |
库大全参考
| 类型 | 索引文件 | 说明 |
|---|
| 容器类库 | [[../ISSUES | 容器类库索引]] |
| 功能类库 | [[../ISSUES | 功能类库索引]] |
| 第三方库 | [[../ISSUES | 第三方库索引]] |
第三部分: 库大全/
C 语言的”标准库”其实很小 — 这正是 C 的特点。真正常用的第三方库才是日常开发的支柱。
容器类库
功能类库 (<stdlib.h> <stdio.h> <string.h> 等)
| 头文件 | 说明 |
|---|
| <stdio.h> | FILE, fopen, fprintf, fread, 缓冲区模式 |
| <stdlib.h> | malloc, atoi, qsort, bsearch, exit |
| <string.h> | memcpy, memmove, memset, strlen, strcmp |
| <math.h> | sin, cos, sqrt, pow, fabs |
| <time.h> | clock, time, localtime, strftime |
| <assert.h> | assert 调试宏 |
| <errno.h> | errno 错误码, perror |
第三方库
| 领域 | 推荐库 | 说明 |
|---|
| 数据结构 | uthash, klib, GLib | C 缺少 STL, 这些库填补空白 |
| 网络 | libcurl, libwebsockets, libuv | HTTP 客户端, WebSocket, 事件循环 |
| 加密 | OpenSSL, libsodium, mbedtls | SSL/TLS, 哈希, 加密算法 |
| 压缩 | zlib, liblzma, zstd | 数据压缩 |
| 数据库 | sqlite3, libpq, hiredis | SQLite, PostgreSQL, Redis 客户端 |
| 测试 | Unity, CMock, Check | C 单元测试框架 |
| JSON | cJSON, jansson, yyjson | JSON 解析 |
| 图形 | raylib, SDL2, cairo | 2D 游戏/图形渲染 |
与数据结构/算法技巧的关系
C 语言教程中的 3数据结构/ 目录是 C 语言实现参考, 主要学习路线请参考 DSA学习路线。此处提供各数据结构在 C 语言中的底层手动实现(指针操作、动态内存管理), 帮助你理解数据结构的本质。
说明: 本教程 3数据结构/ 为 C 语言实现参考。数据结构的系统学习方法、习题和进阶内容, 请以 DSA学习路线 为主线。
| 根数据结构主题 | C 语言底层参考 |
|---|
| 栈 | [[../ISSUES |
| 链表 | [[../ISSUES |
| 哈希表 | [[../ISSUES |
| 树 | [[../ISSUES |
| 堆 | [[../ISSUES |
| 图 | [[../ISSUES |
配套资源
| 模块 | 入口 |
|---|
| 学习路径 | [[../ISSUES |
| 数据结构 | [[../ISSUES |
| C→C++ | [[../ISSUES |
| C++ 教程 | [[../ISSUES |
| 内核思想 | [[../ISSUES |
| 汇编基础 | [[../ISSUES |