C 语言与数据结构算法:一页纸学习计划
- 主题路径:
docs/topics/c-language-data-structures-algorithms/ - 主分类:编程语言
- 辅助分类:数据结构与算法
- 适合对象:零基础或仅掌握简单语法的学习者;目标是用 C 语言解决结构化问题并独立完成小型项目
- 建议周期:12~16 周(每周 8~12 小时,含编码、阅读、复盘)
- 前置知识:会使用命令行、能安装编译器、能用文本编辑器写代码
- 最终目标:能独立分析问题、选择数据结构、用 C 实现基础算法,并完成一个可编译运行、带 README 的综合项目
学习路线
C 语言语法
→ 函数、数组、字符串
→ 指针、结构体、动态内存
→ 复杂度分析与递归
→ 链表、栈、队列
→ 排序与查找
→ 树、堆、哈希表
→ 图、DFS、BFS
→ 贪心、分治、回溯、动态规划
→ 综合项目与算法题训练
每一步都是下一步的前置;不要跳级、不要并行学多个阶段。
阶段周数分配(12~16 周,量力而行)
| 阶段 | 12 周方案 | 16 周方案 | 备注 |
|---|---|---|---|
| 1. C 基础 | 1.5 周 | 2 周 | 含 Day 1~7 任务 |
| 2. 指针与内存 | 1.5 周 | 2 周 | 必须配合画内存图 |
| 3. 递归与复杂度 | 1 周 | 1.5 周 | 复杂度思想需要消化 |
| 4. 线性结构 | 2 周 | 2.5 周 | 链表是重头戏 |
| 5. 排序与查找 | 1.5 周 | 2 周 | 五种排序 + 二分 |
| 6. 树与哈希 | 1.5 周 | 2 周 | BST / 堆 / 哈希 |
| 7. 图算法 | 1.5 周 | 2 周 | DFS / BFS / Dijkstra |
| 8. 综合算法 | 1 周 | 1 周 | 分类与状态转移 |
| 9. 综合项目 | 0.5 周 | 1 周 | 含 README 与复盘 |
12 周方案对应每天满负荷、每天 12 小时投入;16 周方案对应每周 8 小时、更稳。选 12 周时建议每周留 1 天复盘。
九阶段:核心知识、实践产出、可观察学会标准
| 阶段 | 核心知识 | 实践产出 | 可观察学会标准 |
|---|---|---|---|
| 1. C 基础 | 类型、运算符、输入输出、条件、循环、函数、数组、字符串 | 学生成绩统计程序(多函数 + 多组测试) | 不看资料能写出能跑的程序,能解释每个函数的输入输出 |
| 2. 指针与内存 | 指针运算、数组与指针关系、结构体、malloc/free、野指针与泄漏 | 动态通讯录(增删改查 + 文件持久化) | 能画出每个变量的内存布局,能解释每次 malloc 对应的 free |
| 3. 递归与复杂度 | 递归调用栈、时间复杂度 O 表示、空间复杂度 | 阶乘、斐波那契、汉诺塔 | 能用递归树推导复杂度,能把递归改写为迭代版本 |
| 4. 线性结构 | 顺序表、单链表、双链表、栈、队列、循环队列 | 链表实现 + 括号匹配程序 | 能独立写出入队、出栈、插入、删除四种操作并测试边界 |
| 5. 排序与查找 | 冒泡、插入、选择、快排(含 partition)、归并(分治思想)、二分查找 | 排序比较工具(输出每种排序耗时与步骤数) | 能独立写出 5 种排序和二分;能说清归并是分治范式;能手写快排 partition 并讲清平均 O(n log n) 与最坏 O(n²) 的触发条件(基准选择) |
| 6. 树与哈希 | 二叉树、三种遍历、二叉搜索树、堆、哈希表(冲突处理) | 文件目录树或哈希通讯录 | 能手写插入与遍历,画出哈希冲突的解决过程 |
| 7. 图算法 | 邻接矩阵、邻接表、DFS、BFS、Dijkstra(最短路径,含基础版与堆优化) | 迷宫或地图寻路小程序 | 能用 DFS 和 BFS 分别解决同一问题并比较结果;知道 Dijkstra 基础版 O(V²) 适用条件(V 小、稠密图、无负权);知道堆优化版 O((V+E) log V) 适用条件(V 大、稀疏图、无负权) |
| 8. 综合算法 | 分治、贪心、回溯、动态规划(背包、最短路径、棋盘) | 至少 4 道题,每题记录思路与状态转移 | 能说出每种范式的适用场景,能写出状态转移方程 |
| 9. 综合项目 | 需求分析、模块划分、测试、文档、复盘 | 一个可编译运行的 C 项目(见下文) | 第三方能按 README 编译运行,作者能讲清每个模块的设计取舍 |
第一周(每天 1.5~2 小时)
Day 1 编译约定:本计划统一使用 C11。编译命令:
gcc -std=c11 -Wall -Wextra source.c -o program。所有源码从 Day 1 起就遵守 C11;当你已经能稳定写出无警告代码,再叠加-Werror -pedantic作为进阶检查。
| 日 | 任务 | 当天交付 |
|---|---|---|
| Day 1 | 装 gcc / clang + VS Code,写出 hello world、读命令行参数;用 gcc -std=c11 -Wall -Wextra 编译 | 一份编译运行笔记(含完整命令) |
| Day 2 | 变量、基本类型、scanf/printf、算术运算 | 写一个温度转换小程序 |
| Day 3 | if/else、switch、布尔表达式 | 写一个简单计算器(加减乘除 + 错误处理) |
| Day 4 | for/while/do-while、循环控制 | 写九九乘法表和素数判断 |
| Day 5 | 函数定义、参数传递、返回值、作用域、头文件拆分 | 把前面的小程序改写成多文件 |
| Day 6 | 一维数组、二维数组、string.h 常用函数 | 写字符串反转、统计单词数 |
| Day 7 | 学生成绩统计项目:读取多名学生成绩,输出平均分、最高分、最低分、及格人数;拆分为 read_scores / compute_stats / print_report 三个函数 | 一份可编译运行的源码 + 一份测试记录 |
Day 7 项目执行次序(避免一次堆叠)
零基础 Day 7 任务量大,按以下次序分两步推进;每一步独立可验证。
步骤 A —— 先打通最小可用版本(预计 60~90 分钟)
- 实现
read_scores:从 stdin 读取若干个浮点数,遇到非数字或 EOF 结束;返回数组与元素个数; - 实现
compute_stats:基于数组计算平均分、最高分、最低分、及格人数(≥ 60); - 实现
print_report:按统一格式打印四项结果; - 用 1 组正常数据(例如 5 名学生:80 75 90 60 55)跑通;
- 用
gcc -std=c11 -Wall -Wextra stats.c -o stats编译;零警告即通过。
步骤 B —— 按清单补齐 4 类边界 / 异常用例(预计 30~45 分钟)
在前一步基础上,按下面清单逐步补足测试,并记录到 notes/week1-day7.md:
| # | 用例 | 期望行为 |
|---|---|---|
| B1 | 空输入(直接 Ctrl+D) | 给出友好提示,不崩溃 |
| B2 | 仅 1 人成绩(如 100) | 平均=100,最高=最低=100,及格=1 |
| B3 | 全不及格(如 40 30 20 50) | 平均、最高、最低、及格人数=0 全部正确 |
| B4 | 异常输入(混入 -5、abc) | 负数拒绝并提示;非数字拦截并提示 |
进阶检查(非首次门槛):当步骤 A、B 都稳定通过、且你能解释每个警告含义时,再叠加 -Werror -pedantic 编译,确认无警告可升级。Day 7 当天不必完成此步。
阶段通用验收(每一阶段都必须通过)
- 不看答案独立重写核心代码;
- 用自己的话解释该知识“解决什么问题、为什么有效”;
- 画一张图:内存布局 / 节点关系 / 算法执行过程;
- 测试空数据、最小值、最大值、异常输入;
- 准备至少 3 组自定义数据并贴出实际输出;
- 记录时间复杂度和空间复杂度;
- 能修改已有程序(加功能、修 bug、调性能),而不是只能照抄。
交付存放:第 3 项的图、第 5 项的输出截图 / 文本、第 6 项的复杂度推导,统一存到当前阶段对应项目目录的
notes/或 README 章节,例如阶段 4 链表的笔记写在stage4-linked-list/notes/。不要散落在聊天记录或临时文件里,便于后续复盘与综合项目引用。
最终验收(学完全部九阶段后)
-
独立实现:单链表、栈、队列;至少 3 种排序(推荐快排、归并、堆排);二叉树 3 种遍历;DFS、BFS;
-
至少完成 30 道基础题(洛谷入门~普及 / 力扣中国 Easy~Medium),分布建议:
阶段 题目数量 难度分布 平台建议 1~3(C 基础 / 指针 / 递归) 6 道 全部 Easy / 入门 洛谷入门 4(线性结构) 6 道 5 Easy + 1 普及 洛谷普及 5(排序与查找) 4 道 3 Easy + 1 Medium 力扣中国 6(树与哈希) 6 道 4 Easy + 2 Medium 力扣中国 + 洛谷 7(图算法) 4 道 2 Medium + 2 普及 洛谷普及 8(综合算法) 4 道 2 Medium + 2 Hard/提高 力扣中国 约束:至少 8 道达到 Medium 或普及难度,且至少有 2 道用于复盘阶段 8 的动态规划。
-
完成 1 个综合 C 项目,自带 README,能被他人按文档编译运行;
-
能用 15 分钟讲清楚整个学习路线和每个阶段的核心权衡。
综合项目
首选:迷宫寻路(必做:控制台输入迷宫并输出路径坐标/地图)。
备选:通讯录 或 图书管理系统(文件存储 + 哈希/树索引 + 增删改查)。
迷宫寻路必做要求:
- 输入:从 stdin 读取迷宫规格,例如第一行
R C,随后R行每行C个字符(#墙 /.路 /S起点 /E终点),或者从文本文件读; - 输出:必输出(1)一条从
S到E的路径坐标序列,例如(0,0) -> (1,0) -> (1,1) -> ...;(2)把迷宫回填路径符号(如*)后打印整张地图; - 算法:必须用 BFS 或 DFS 求最短/可达路径;如选 BFS,需说明为什么 BFS 在无权图上能得到最短路径;
- 进阶可选:ASCII 动画逐步展开、SDL/ncurses 图形界面、GUI 库;这些是加分项,不是验收门槛。
notes/ 与 README 存放规范
所有“画图(内存 / 节点 / 执行过程)”和“贴输出”类交付物统一存放在项目根目录的 notes/ 子目录或 README 的对应章节;提交时一并带上,避免散落在聊天或临时文件里。综合项目的 notes/ 至少包含:
notes/design.md:数据结构选择理由、算法说明、模块图;notes/test.md:每组测试数据的输入、期望输出、实际输出;notes/retrospective.md:复盘(用时、难点、收获、下一步)。
任何综合项目都必须包含:
- 需求说明:要解决的问题、用户故事、输入输出约定;
- 数据结构选择理由:为什么用这个结构,时间/空间复杂度如何;
- 核心算法说明:关键函数伪代码或流程图;
- 模块化源码:
.h/.c分文件,函数职责单一; - 边界测试:空输入、极端输入、非法输入都有处理;
- 编译说明:
Makefile或清晰的gcc命令,注明依赖; - README:项目介绍、运行步骤、目录结构、复盘(踩过的坑、可改进点);
- 复盘记录:用时、难点、收获、下一步。
推荐开源资料(按角色分工,避免堆链接)
| 阶段 | 角色 | 资料 | 链接 | 用法 |
|---|---|---|---|---|
| 1~2 | C 语言入门 | 菜鸟教程 C 语言 | https://www.runoob.com/cprogramming/c-tutorial.html | 中文友好,覆盖语法 + 小例子,适合零基础 |
| 1~2 | C 语言查阅 | cppreference C | https://en.cppreference.com/w/c | 仅供查阅:查标准库函数签名、关键字语法;不替代入门教程 |
| 3+ | 主线解释 | Hello 算法 | https://www.hello-algo.com/ | 数据结构 / 算法概念入门,图解 + 伪代码 |
| 7~8 | 算法进阶 | OI Wiki | https://oi-wiki.org/ | DFS / BFS / 贪心 / DP / 图论查漏补缺 |
| 4 之后 | C 源码对照 | a46554/c-algorithms | https://github.com/a46554/c-algorithms | 自己实现链表后再读,对照风格 |
| 4 之后 | C 源码对照 | The Algorithms | https://github.com/TheAlgorithms/ | 看成熟实现,补工程细节 |
| 5+ | 可视化 | Algorithm Visualizer | https://github.com/algorithm-visualizer/algorithm-visualizer | 观察算法执行过程,验证理解 |
| 4+ | 题目练习 | 洛谷 | https://www.luogu.com.cn/ | 中文题库,入门到省选 |
| 5+ | 题目练习 | 力扣中国 | https://leetcode.cn/ | 面试导向,分专题练习 |
许可证提示:从 a46554/c-algorithms、The Algorithms 等开源仓库复制或参考源码前,必须先打开其 LICENSE 文件确认许可证类型(MIT / Apache-2.0 / GPL 等)。GPL 类代码用于商业 / 闭源项目前请逐条阅读;MIT/Apache 在保留版权声明的前提下通常可直接使用。默认做法是读思路后自己重写,而不是复制粘贴。
源码阅读时机:GitHub 源码对照资料放到“阶段 4(线性结构)之后”再读。原因是:前 3 阶段目标是建立“从需求到代码”的独立实现能力;过早读成熟源码会变成抄写而非理解。阶段 4 之后你已经能写链表,此时读对照资料才有意义。
默认使用顺序:先用菜鸟教程 / Hello 算法建立概念 → 用 cppreference 查阅(非通读)语法 → 自己用 C 独立实现 → 用 Algorithm Visualizer 验证 → 阶段 4 后读 a46554/c-algorithms 和 The Algorithms 对照 → 在洛谷/力扣做题巩固 → 写复盘到 notes/retrospective.md。
常见误区
- 把“看完视频/书”当成学会;不写代码就以为自己会了;
- 跳过指针和内存直接学数据结构,写出来的链表到处段错误;
- 死记硬背排序代码,不会分析复杂度,不会写快排的 partition;
- 只会“调通能跑”,不测试边界、异常、空数据;
- 只刷题不写项目,或只写项目不刷题,二者缺一不可;
- 把参考资料当教材,从头到尾读完一本再动手,应该先动手再查;
- 抄写代码而不画图、不解释、不改造,过两周就忘;
- 用宏、全局变量、goto 应付所有问题,不练习模块化拆分;
- 学完不复习不复盘,下次面试/考试依然答不上来;
- 一个人闷头学,不读开源项目、不写 README、不让他人复现。
所有知识点分类(统一规则)
后续新增主题时按此归类,再套用一页纸模板;一个主题可有一个主分类和一个辅助分类。本计划归属见最末行。
- 编程语言:C、Java、Python、JavaScript 等
- 数据结构与算法:排序、查找、图、DP 等
- 计算机基础:OS、网络、数据库、组成原理等
- 工程技术:Git、Linux、Docker、测试、CI/CD 等
- Web 与后端:HTTP、REST、Spring Boot、数据库开发等
- 前端与客户端:HTML/CSS、JavaScript、React、移动开发等
- 数据与人工智能:SQL、机器学习、深度学习、数据分析等
- 项目与职业能力:软件设计、调试、代码规范、技术写作等
本计划:编程语言(C) 主 + 数据结构与算法 辅。
学习资料汇聚(v0.3)
本节是主题文件自包含的最后一节;不再依赖
notes/子目录。补足内容直接写在本节内,缺失处标 “由本计划生成”。外部图片或大型标准文档以链接 / 附件形式挂在本节。由本计划生成 / Generated by this plan(本节内容基于公开资料的整理与示范;非第三方讲解的复制)。
9.1 背景与动机
- C 由 Dennis Ritchie 在 1972 年前后于贝尔实验室开发,用于重写 Unix 操作系统。
- C 设计目标:贴近硬件、可移植、足够高级以表达结构,又足够低级以控制系统资源。
- 至今仍活跃:操作系统内核(Linux、macOS、Windows 内核部分)、嵌入式、编译器、数据库、解释器运行时、网络协议栈几乎都用 C 实现。
- 一句话总结:C 是“让程序员直接对内存和 CPU 说话”的语言,是理解计算机底层最有效的入口。
9.2 概念地图
核心概念(≥5):
flowchart LR
源文件((源文件 .c))
头文件[(头文件 .h)]
预编译[预编译]
编译[编译]
汇编[汇编]
链接[链接]
可执行[可执行文件]
类型[类型系统]
表达式[表达式]
控制流[控制流]
函数[函数]
指针[指针]
内存[内存管理]
数组[数组]
字符串[字符串]
结构体[结构体]
库[标准库 / 第三方库]
源文件 --> 预编译
头文件 --> 预编译
预编译 --> 编译 --> 汇编 --> 链接
库 --> 链接
链接 --> 可执行
类型 --> 表达式
表达式 --> 控制流
控制流 --> 函数
函数 --> 指针
指针 --> 内存
指针 --> 数组
数组 --> 字符串
类型 --> 结构体
关系说明:
- 编译流程:源文件 + 头文件 → 预编译 → 编译 → 汇编 → 链接 → 可执行。
- 概念依赖:
类型 → 表达式 → 控制流 → 函数 → 指针 → 内存/数组 → 字符串/结构体。 - 库(标准库 + 第三方库)在链接阶段加入,与函数、指针、内存模型直接相关。
9.3 基础知识讲解
主推(评分 ≥4,零基础友好;示范文件可超出 1~2 个上限,正式主题建议 ≤2):
| 资料 | 角色 | 评分 | 链接 |
|---|---|---|---|
| 菜鸟教程 C 语言 | 零基础中文入门 | 4 | https://www.runoob.com/cprogramming/c-tutorial.html |
| Hello 算法 C 语言部分 | 概念图解 | 4 | https://www.hello-algo.com/ |
| cppreference C | 查阅手册 | 4 | https://en.cppreference.com/w/c |
| Beej’s Guide to C Programming | 进阶英文讲解 | 4 | https://beej.us/guide/bgc/ |
备查(评分 3):
| 资料 | 角色 | 链接 |
|---|---|---|
| CS50 C 课程 | 视频讲解 | https://cs50.harvard.edu/x/ |
| OI Wiki C 基础 | 简明语法回顾 | https://oi-wiki.org/ |
| Learn-C.org | 互动练习 | https://www.learn-c.org/ |
缺失部分:本计划不重写第三方资料;如读者在“指针与内存”阶段仍卡住,请按 §9.4 中的段错误清单逐条排查。
9.4 经典问题与经典案例
| # | 问题 | 为什么会重要 | 最简答案 |
|---|---|---|---|
| 1 | 段错误(Segmentation fault) | 90% 零基础第一周会遇到 | 检查空指针解引用、数组越界、栈溢出 |
| 2 | 内存泄漏(Memory leak) | 长时间运行程序会逐渐耗尽内存 | 每次 malloc 都对应 free;用 valgrind 验证 |
| 3 | 悬空指针(Dangling pointer) | free 后再使用指针会读垃圾数据 | 释放后将指针置 NULL |
| 4 | printf 格式串与参数不匹配 | 会读栈上随机数据,可能输出乱码或崩溃 | 启用 -Wall -Wextra,编译器会告警 |
| 5 | 整数溢出 | 32 位 signed 超过 2^31−1 后变负数 | 用 <stdint.h> 的 int32_t;做边界检查 |
| 6 | 头文件重复包含 | 编译时间膨胀、符号重定义 | 使用 #ifndef FOO_H / #define FOO_H / #endif 守卫 |
| 7 | main 返回值语义 | 0 表示成功;非 0 表示失败,shell $? 依赖它 | int main(void) 显式 return 0 |
| 8 | 函数指针用途 | 实现回调、状态机、跳转表 | int (*op)(int,int) = add; 然后 op(2,3); |
| 9 | C 与 C++ 在链接上的差异 | C 名称不修饰;C++ 会 name mangling | C 函数给 C++ 用需 extern "C" |
| 10 | scanf 缓冲区遗留换行 | 下一次 gets/fgets 会读到空行 | 用 getchar() 消耗换行,或改用 fgets |
9.5 学习难点
概念难点
| 难点 | 为什么会卡 | 突破路径 |
|---|---|---|
| 指针 vs 引用 | C 没有引用,只有“指针+解引用” | 用 int *p = &x; 画三栏:变量 / 地址 / 值 |
| 数组与指针的等价与不等价 | 大多数场景下等价,但 sizeof 不同 | 在纸上写 a &a *a 三个值,比较大小 |
| 栈 vs 堆 | 局部变量在栈,malloc 在堆 | 画函数调用栈,标出每帧的变量;用 malloc 后写回收单 |
思维难点
| 难点 | 为什么会卡 | 突破路径 |
|---|---|---|
| 递归调用栈展开 | 脑子装不下多层调用 | 用“递推 + 回溯”两步拆;先写终止条件 |
| 复杂度从代码反推 | 不会算循环嵌套的复杂度 | 数循环层数 × 每次代价;画递推式 |
| 状态机思维 | 算法题经常要记“当前状态” | 先画状态转移图,再写代码 |
工程难点
| 难点 | 为什么会卡 | 突破路径 |
|---|---|---|
| 多文件组织 | Makefile 第一次写容易乱 | 先用单文件通过;再拆 .h/.c;最后加 Makefile |
| 编译警告解读 | 一开始看不懂 unused variable | 每次警告都去查;用 -Wall -Wextra 当老师 |
| 调试器使用 | gdb 第一次接触很陡 | 学会 b / r / n / s / p 五个命令够 80% 场景 |
| 链接错误排查 | undefined reference 难定位 | 看头文件声明 vs 源文件定义;检查 -l 参数 |
9.6 技术标准与接口
9.6.1 Entity
| 名称 | 版本 | 发布组织 | 状态 | 许可证 / 可访问性 |
|---|---|---|---|---|
| ISO/IEC 9899:2011 | C11 | ISO/IEC JTC1/SC22 / WG14 | 正式 | 收费;草案公开于 open-std.org |
| ISO/IEC 9899:2018 | C17 | 同上 | 正式,缺陷修复 | 同上 |
| ISO/IEC 9899:2024 | C23 | 同上 | 正式,最新 | 同上 |
| POSIX.1-2017 | IEEE Std 1003.1-2017 | IEEE / The Open Group | 正式 | 全文公开于 opengroup.org |
| GNU C Library (glibc) | 持续更新 | GNU Project | 事实标准 | LGPL |
| musl libc | 持续更新 | musl 项目 | 嵌入式/轻量首选 | MIT |
9.6.2 Scope
- C 标准:定义语言、语法、语义、标准库函数;不规定 ABI、不规定操作系统。
- POSIX:定义操作系统 API、shell、工具;与 C 标准库有重叠但更广。
- glibc / musl:POSIX 与 C 标准的开源实现,承担具体行为。
- 关系:C 标准 → glibc/musl 实现;POSIX → 在 glibc/musl 之上的扩展。
9.6.3 Structure
- C 标准:
§5语法、§6语言、§7库。 - 常用头文件:
<stdio.h>、<stdlib.h>、<string.h>、<math.h>、<stdint.h>、<stdbool.h>、<errno.h>、<assert.h>。 - POSIX 三大卷:Base Definitions、System Interfaces(重点)、Shell & Utilities。
- 零基础本阶段必须掌握:
printf/scanf/malloc/free/fopen/fread/fwrite/memcpy/memset/strlen/strcmp。
9.6.4 Ecosystem
- 编译器实现:GCC、Clang、MSVC、Intel C(ICC/ICX)、TCC。
- C 标准库实现:glibc(Linux 主流)、musl(Alpine、嵌入式)、MSVCRT(Windows)、BSD libc。
- 扩展:GCC 的
__attribute__、__builtin_*;Clang 的__has_attribute;这些不在 ISO 标准里,跨编译器需用__GNUC__/__clang__宏守护。 - 事实标准 vs 标准本身:例如
printf长度修饰符z在 C99 才有;某些旧教材示例在 C89 下编译失败。
9.6.5 Depth Tiers
| 层级 | 名称 | 必须看到什么 |
|---|---|---|
| L0 | 知道存在 | 知道 C 有 ISO 标准;知道 C11/C17/C23 三个常见版本 |
| L1 | 看得懂示例 | 教程中看到 <stdio.h> / <stdlib.h> 不陌生 |
| L2 | 能正确调用 | 能按 <stdlib.h> 文档写出 malloc / printf / fopen |
| L3 | 能解释与排错 | 能解释段错误常见原因、errno 与返回值的含义 |
| L4 | 能设计与扩展 | 能基于 C 标准为嵌入式场景裁剪 libc |
本计划目标:阶段 9 综合项目时达到 L3。
9.6.6 Source
- open-std.org:WG14 工作组(C 标准草案、最新提案)。
- opengroup.org:POSIX.1-2017 在线全文。
- cppreference.com(C 段):作为查询手册,不替代标准。
- 引用的版本快照日期:2026-07-28。