📋 知识地图
说明:✅ = 已有覆盖(可继续深化) ⬜ = 待扩充
一、语言基础
- ⬜ C语言发展史与标准演进(K&R / ANSI C / C99 / C11 / C17)
- ⬜ 编译过程全链路:预处理 → 编译 → 汇编 → 链接
- ⬜ GCC / Clang 编译器使用与常用选项
- ⬜ C语言与其他语言(C++/Go/Rust)的关系与定位
二、程序结构与预处理器
- ✅ 基本程序结构(main 函数、include、return)
- ✅ 宏定义(#define)与带参宏
- ⬜ 条件编译(#ifdef / #ifndef / #if / #else)
- ⬜ #include 深入(尖括号 vs 引号、头文件守卫 #pragma once)
- ⬜ 预定义宏(FILE / LINE / DATE / TIME)
三、数据类型体系
- ✅ 基本数据类型(int / char / float / double)
- ✅ 构造类型(枚举 / 数组 / 结构体 / 共用体)
- ✅ 常量与强制类型转换
- ⬜ 类型限定符(const / volatile / restrict)
- ⬜ typedef 类型别名
- ⬜ 整数溢出与浮点精度陷阱
- ⬜ 字节序(大端 vs 小端)与内存对齐
四、运算与表达式
- ✅ 算术 / 关系 / 逻辑 / 位运算
- ✅ 三目运算符
- ⬜ 运算符优先级与结合性全表
- ⬜ 自增/自减的序列点(sequence point)陷阱
五、程序流程控制
- ✅ if-else 判断结构
- ✅ switch 分支
- ✅ for / while / do-while 循环
- ✅ break / continue 中断
- ⬜ goto 的合理使用场景(错误处理跳转)
六、函数
- ✅ 函数声明、定义与调用
- ⬜ 参数传递机制(值传递 vs 指针传递)
- ⬜ 递归与尾递归
- ⬜ 可变参数函数(stdarg.h)
- ⬜ 内联函数(inline)
- ⬜ 函数指针与回调机制
七、指针(C语言精髓)
- ✅ 指针基本概念(地址、&、*)
- ✅ 二级指针
- ⬜ 指针与数组的关系(arr[i] ≡ *(arr+i))
- ⬜ 指针运算与数组遍历
- ⬜ 函数指针与typedef
- ⬜ void* 泛型指针
- ⬜ 悬空指针(dangling pointer)与野指针
- ⬜ const 与指针的组合语义
八、内存管理
- ⬜ 栈(stack)vs 堆(heap)vs 静态区
- ⬜ malloc / calloc / realloc / free
- ⬜ 内存泄漏检测工具(Valgrind)
- ⬜ 常见内存错误:越界、double free、use-after-free
九、复合数据结构
- ✅ 结构体(struct)定义与使用
- ✅ 共用体(union)
- ✅ 枚举(enum)
- ⬜ 结构体内存对齐(sizeof 原理)
- ⬜ 链表、栈、队列的 C 实现
- ⬜ 哈希表与二叉树的 C 实现
十、文件 I/O
- ⬜ fopen / fclose / fread / fwrite / fprintf / fscanf
- ⬜ 文本模式 vs 二进制模式
- ⬜ 文件定位(fseek / ftell / rewind)
- ⬜ 标准输入输出重定向
十一、标准库精选
- ⬜ <stdio.h>:输入输出
- ⬜ <stdlib.h>:内存、随机数、系统交互
- ⬜ <string.h>:字符串操作(strcpy / strcmp / strlen 等)
- ⬜ <math.h>:数学函数
- ⬜ <time.h>:时间处理
- ⬜ <ctype.h>:字符分类与转换
十二、多文件工程
- ⬜ 头文件与源文件的组织规范
- ⬜ Makefile 基础(目标、依赖、命令)
- ⬜ 静态库(.a)与动态库(.so / .dll)的创建与使用
- ⬜ CMake 入门
十三、调试与质量
- ⬜ GDB 基础(断点 / 单步 / 变量检查 / 回溯)
- ⬜ assert 断言
- ⬜ 代码风格规范(缩进、命名)
- ⬜ 未定义行为(UB)常见案例
十四、实战项目参考
- ✅ 2048 控制台游戏(源码分析)
- ✅ 学生信息管理系统(源码分析)
- ⬜ 简易 HTTP 服务器
- ⬜ 数据库连接示例(MySQL C API)
C语言程序结构
hello world!
1 | #include<stdio.h> |
预处理
#define 宏名 字符串
类似一种预替换。
1 | #define M(y) y*y+3*y //带形参的宏定义 |
数据类型与格式化输出
基本数据类型
- 整型 int
- 字符型 char
- 实型(单精、双精) float/double
构造数据类型
- 枚举类型
- 数组类型 //
数据类型 数组名称[长度]; - 结构体类型
- 共用体类型
指针类型
空类型四大类
格式化输出
printf("普通字符输出格式符", 输出项);
- %d 整数
- %c 单个字符
- %s 字符串
- %f 实数
常量
#define POCKETMONEY 10 //定义常量及常量值
定义方式为 #define 标识符 常量值
强制类型转换
(数据类型) (表达式)
如 (int)(x/2+y)
运算
常见表达式
| 运算表达式 | 说明 |
|---|---|
| ++a | 先自加,再取值 |
| a– | 取值后自减 |
| a+=5 | a = a+5,即先加再赋值 |
| == | 判断符号 |
| && | 与 |
| ! | 非。如!(5>8)为真 |
位运算
| 运算符 | 说明 | 详细 |
|---|---|---|
| & | 按位与 | 9&5在内存中解为二进制,仅1与1为1 |
| | | 按位或 | 如上,有1则1 |
| ^ | 按位异或 | 如上。不同为1,相同为0 |
| ~ | 取反 | 取反 |
| << | 左移 | 二进制左移,丢高位,低位补0 |
| >> | 右移 | 丢地位,高位按高位内容补 |
三目运算
表达式1 ? 表达式2 : 表达式3;
意为先判断表达式1的值是否为真,如果是真的话执行表达式2;如果是假的话执行表达式3。
程序结构
判断体
if判断结构
1 | if(表达式1) |
switch语句
1 | switch(){ |
循环体
for循环
1 | for(执行1;判断1;每次循环句) |
while循环
1 | while(为“真”即循环) |
do-while循环
1 | do |
break和continue循环中断
break跳出当前一层循环;
continue结束本次循环开始下次。
定义函数
函数声明及调用
1 | [数据类型说明] 函数名称([参数]); //类型用void |
指针
指针的本质就是一个保存变量数据存储地址的变量,即内存编号,是一个以十六进制表示的整数,可以加减运算。
int a=10,*pa=&a;
&可用于取变量地址。
如果一个指针指向的是另外一个指针,我们就称它为二级指针,或者指向指针的指针。
int a=100,*p1=&a,*p2=&p1; //禁止套娃
结构体与枚举
结构体
结构体是存储不同类型数据的集合,又被称为复杂数据类型。作为一种数据类型,即可用于定义变量,甚至数组、指针。其数据在内存中如数组一样,也是连续的。
1 | struct stu{ //stu是结构体名称 |
共用体(很少用)
共用体与结构体类似,但占用的内存为相同【不好理解】,而不像结构体那样,生成的变量占用的内存互不干扰。
1 | union data{ |
枚举
枚举默认给其中的内容按顺序赋值,也可以指定值。
enum typeName{ valueName1, valueName2, valueName3, ...... };
如:
enum week{ Mon = 1, Tues = 2, Wed = 3, Thurs = 4, Fri = 5, Sat = 6, Sun = 7 }
经典c语言程序
c语言2048(来自网络)
1 | /* |
c语言学生信息管理系统(来自网络)
1 | #define _CRT_SECURE_NO_WARNINGS 1 |