第1章 必须厘清的核心概念 2
1.1堆栈 2
1.2全局变量和局部变量 5
1.3生存期和作用域 7
1.3.1生存期 7
1.3.2作用域 10
1.4内部函数和外部函数 11
1.5指针变量 14
1.6指针数组和数组指针 17
1.7指针函数和函数指针 20
1.8传值和传址 22
1.9递归和嵌套 25
1.10结构体 29
1.11共用体 32
1.12枚举 37
1.13位域 39
第2章 预处理 47
2.1文件的包含方式 48
2.2宏定义 50
2.2.1简单宏替换 50
2.2.2带参数的宏替换 52
2.2.3嵌套宏替换 56
2.3宏定义常见错误解析 56
2.3.1不带参数的宏 56
2.3.2带参数的宏 59
2.4条件编译指令的使用 62
2.5 #pragma指令的使用 65
第3章 选择结构和循环结构的程序设计 69
3.1 if语句及其易错点解析 70
3.2条件表达式的使用 76
3.3 switch语句的使用及注意事项 78
3.4 goto语句的使用及注意事项 85
3.5 for语句的使用及注意事项 87
3.6 while循环与do while循环的使用及区别 92
3.7循环结构中break、continue、goto、return和exit的区别 98
第4章 数组 103
4.1一维数组的定义及引用 104
4.2二维数组的定义及引用 110
4.3多维数组的定义及引用 117
4.4字符数组的定义及引用 119
4.5数组作为函数参数的易错点解析 124
4.6动态数组的创建及引用 130
第5章 指针 139
5.1不同类型指针之间的区别和联系 140
5.2指针的一般性用法及注意事项 144
5.3指针与地址之间的关系 148
5.4指针与数组之间的关系 153
5.5指针与字符串之间的关系 161
5.6指针与函数之间的关系 163
5.7指针与指针之间的关系 169
第6章 数据结构 172
6.1枚举类型的使用及注意事项 173
6.2结构体变量的初始化方法及引用 177
6.2.1结构体的初始化 177
6.2.2结构体的引用 180
6.3结构体字节对齐详解 184
6.4共用体变量的初始化方法及成员的引用 193
6.5传统链表的实现方法及注意事项 196
6.6颠覆传统链表的实现方法 214
6.6.1头结点的创建 214
6.6.2结点的添加 215
6.6.3结点的删除 217
6.6.4结点位置的调整 219
6.6.5检测链表是否为空 221
6.6.6链表的合成 222
6.6.7宿主结构指针 225
6.6.8链表的遍历 225
第7章 函数 230
7.1函数参数 231
7.2变参函数的实现方法 235
7.3函数指针的使用方法 241
7.4函数之间的调用关系 245
7.5函数的调用方式及返回值 251
第8章 文件 255
8.1文件及文件指针 256
8.2 EOF和FEOF的区别 259
8.3读写函数的选用原则 264
8.4位置指针对文件的定位 270
8.5文件中的出错检测 275
第9章 调试和异常处理 279
9.1 assert宏的使用及注意事项 280
9.2如何设计一种灵活的断言 283
9.3如何实现异常处理 287
9.4如何处理段错误 293
第10章 陷阱知识点解剖 299
10.1 strlen和sizeof的区别 300
10.2 const修饰符 301
10.3 Volatile修饰符 305
10.4 Void和Void*的区别 311
10.5 #define和typedef的本质区别 314
10.6条件语句的选用 317
10.7函数realloc、malloc和calloc的区别 319
10.8函数和宏 322
10.9运算符==、=和!=的区别 323
10.10类型转换 324
第11章 必须掌握的常用算法 326
11.1时间复杂度 327
11.2冒泡法排序 329
11.3选择法排序 332
11.4快速排序 334
11.5归并排序 337
11.6顺序查找 340
11.7二分查找 341
附录 如何养成良好的编程习惯 344