第0章 笔试题自测 1
第1章 灵魂——指针 5
1.1 指针与字符串 5
1.1.1 知识点题型 5
101 p++ 5
102 打印内存地址 7
103 sprintf()与snprintf() 7
104 指针常量与常量指针 8
105 字符与字符串 9
106 指针变量与普通变量 10
107 指针运算 11
108 “%-10.5s” 11
1.1.2 综合题型 12
109 字符串复制 12
110 统计字符个数 14
1.2 指针与数组 16
1.2.1 知识点题型 16
111 一维数组与指针 16
112 数组中strlen与sizeof的区别 16
113 多维数组 17
114 数组作为参数传递给函数 19
115 char(*(*x())[5])()与typedef 19
1.2.2 综合题型 20
116 编程求较大数的阶乘 20
117 字符旋转 22
1.2.3 数组总结 25
1.3 指针与结构体 26
1.3.1 知识点题型 26
118 __attribute__((__packed__))含义 26
119 union与struct类型区别 28
1.3.2 综合题型 29
120 Little-endian与Big-endian 29
1.3.3 结构体总结 30
1.4 本章总结 31
第2章 数据存储——内存 32
2.1 数据类型的存储 32
2.1.1 知识点题型 33
201 char*a[3][4]占内存大小 33
202 int*p[M]与int(*p)[M] 33
203 数组元素指针与数组元素大小的计算 33
204 #define与typedef区别 34
205 sizeof(p) 35
206 关键字“static”修饰变量与函数 36
207 char不等于signed char 36
208 unsigned类型值与0的关系 37
209 不同数据类型的赋值 38
2.1.2 综合题型 39
210 验证C语言内存分配 39
2.2 内存相关的bug 41
2.2.1 知识点题型 41
211 返回栈地址 41
212 未初始化与内存访问越界 41
213 使用已释放的内存 42
214 数组越界 43
215 内存泄漏之内存释放顺序 43
216 内存泄漏之重新赋值 44
217 内存泄漏之谨慎使用函数返回值 45
218 内存泄漏之退出函数路径 47
2.2.2 综合题型 48
219 时间GeneralizedTime编码格式 48
220 浮点数的存储格式 49
221 实现小应用——万年历 51
2.3 本章总结 54
第3章 程序的思想——算法 56
3.1 基本数据结构 56
3.1.1 知识点题型 56
301 栈-迷宫问题 56
302 队列——旅行家的预算 62
303 链表——约瑟夫问题 69
304 二叉树遍历 71
305 Modbus CRC 72
3.1.2 综合题型 74
306 汉诺塔问题 74
307 找符合规则的数 77
3.2 查找与排序 78
3.2.1 查找 78
308 二分法查找 78
309 Hash查找 80
3.2.2 排序 83
310 选择排序 83
311 冒泡排序 84
312 插入排序 86
313 快速排序 87
3.3 综合试题 90
314 Colored Cubes 90
3.4 本章总结 95
第4章 程序的基本单位——函数 97
4.1 自定义函数 97
4.1.1 知识点题型 97
401 函数声明与定义 97
402 十六进制转十进制 99
403 函数纠错 101
404 找出子串的个数 102
405 指针函数与函数指针 103
406 回调函数 104
407 可变参数函数 106
408 函数调用 108
409 内联(inline)函数 110
410 main()函数的命令行参数 112
4.1.2 综合题型 114
411 hexdump()函数 114
412 Sequence of Function Execution 115
4.2 库函数 116
4.2.1 知识点题型 117
413 调试相关的宏 117
414 大小写字母的转换 117
415 文件操作 119
416 数学库 122
4.2.2 综合题型 123
417 All Combinations of a Word 123
4.2.3 库函数总结 128
4.3 本章总结 128
第5章 数据的传递——网络 130
5.1 网络基础 130
5.1.1 知识点题型 130
501 网络字节序 130
502 IP地址转换 131
503 设计数据报文头结构 133
504 IP头校验和 135
5.1.2 综合题型 137
505 RC4 Algorithm 137
506 解析URL 141
5.2 Linux Socket编程 143
5.2.1 TCP Socket APIs 143
5.2.2 UDP Socket APIs 146
5.2.3 典型试题 148
507 实现简单ping命令 148
508 实现HTTP GET 156
509 Blocking和Non-blocking 160
510 select()函数用法 161
511 fork()与pthread_create() 166
5.3 综合试题 170
512 SYN洪流攻击 170
5.4 本章总结 179
第6章 专用的计算机系统——嵌入式 181
6.1 嵌入式编程基础 181
601 对寄存器的位操作 181
602 register关键字 182
603*(volatile unsigned long*)0xfff40080; 183
604 #ifdef、#if、#if defined和#ifndef 183
605 -1在内存中的表示 184
606 找出重复的数 185
607 #define中的“##”与“#” 186
608 计算一个整数中含1的比特数 187
609 递归计算 188
610 数值溢出运算 189
611 定义boolean类型 189
612 for()、while()与do{}while() 189
613 位域应用 190
614 break与continue的区别 191
615 指针偏移计算 193
616 判断链表是否存在环 194
617 const与指针 196
618 指向绝对地址执行 196
619 同名变量(全局变量与局部变量) 197
620 gets()与fgets() 198
621 头文件重复引用 199
6.2 可移植性 200
622 u8、u16、u32和u64 200
623 条件编译 200
624 转义字符问题 202
625 提高可移植性常见技巧 203
6.3 代码优化 203
626 i--与i<10 203
627 switch代替if…else 204
628 代码优化的常见技巧 205
6.4 综合试题 205
629 模拟Modbus协议 205
6.5 本章总结 209
第7章 终结语 211
7.1 编程习惯 211
7.2 Bug案例 214
7.3 学习技巧 217
7.4 本章总结 220
附录A ASCII码表 221
附录B C语言运算符优先级 223
附录C 标准C头文件 225
参考文献 226