上篇 C语言入门 2
第1章 程序的基本概念 2
1.1 程序和编程语言 2
1.2 自然语言和形式语言 6
1.3 程序的调试 7
1.4 第一个程序 9
第2章 常量、变量和表达式 12
2.1 继续Hello World 12
2.2 常量 15
2.3 变量 16
2.4 赋值 18
2.5 表达式 19
2.6 字符类型与字符编码 23
第3章 简单函数 24
3.1 数学函数 24
3.2 自定义函数 26
3.3 形参和实参 31
3.4 全局变量、局部变量和作用域 35
第4章 分支语句 41
4.1 if语句 41
4.2 if/else语句 43
4.3 布尔代数 45
4.4 switch语句 49
第5章 深入理解函数 51
5.1 return语句 51
5.2 增量式开发 54
5.3 递归 58
第6章 循环语句 64
6.1 while语句 64
6.2 do/while语句 66
6.3 for语句 67
6.4 break和continue语句 69
6.5 嵌套循环 70
6.6 goto语句和标号 71
第7章 结构体 74
7.1 复合类型与结构体 74
7.2 数据抽象 78
7.3 数据类型标志 82
7.4 嵌套结构体 84
第8章 数组 85
8.1 数组的基本概念 85
8.2 数组应用实例:统计随机数 88
8.3 数组应用实例:直方图 91
8.4 字符串 94
8.5 多维数组 95
第9章 编码风格 100
9.1 缩进和空白 100
9.2 注释 104
9.3 标识符命名 107
9.4 函数 108
9.5 indent工具 108
第10章 gdb 110
10.1 单步执行和跟踪函数调用 110
10.2 断点 117
10.3 观察点 121
10.4 段错误 125
第11章 排序与查找 128
11.1 算法的概念 128
11.2 插入排序 129
11.3 算法的时间复杂度分析 131
11.4 归并排序 133
11.5 线性查找 138
11.6 折半查找 139
第12章 栈与队列 144
12.1 数据结构的概念 144
12.2 堆栈 144
12.3 深度优先搜索 146
12.4 队列与广度优先搜索 152
12.5 环形队列 156
本阶段总结 159
下篇 C语言本质 162
第13章 计算机中数的表示 162
13.1 为什么计算机用二进制计数 162
13.2 不同进制之间的换算 164
13.3 整数的加减运算 165
13.3.1 Sign and Magnitude表示法 165
13.3.2 1′s Complement表示法 166
13.3.3 2′s Complement表示法 167
13.3.4 有符号数和无符号数 168
13.4 浮点数 169
第14章 数据类型详解 172
14.1 整型 172
14.2 浮点型 176
14.3 类型转换 177
14.3.1 Integer Promotion 177
14.3.2 Usual Arithmetic Conversion 178
14.3.3 由赋值产生的类型转换 179
14.3.4 强制类型转换 179
14.3.5 编译器如何处理类型转换 179
第15章 运算符详解 182
15.1 位运算 182
15.1.1 按位与、或、异或、取反运算 182
15.1.2 移位运算 183
15.1.3 掩码 184
15.1.4 异或运算的一些特性 185
15.2 其他运算符 186
15.2.1 复合赋值运算符 186
15.2.2 条件运算符 186
15.2.3 逗号运算符 187
15.2.4 sizeof运算符与typedef类型声明 187
15.3 Side Effect与Sequence Point 189
15.4 运算符总结 191
第16章 计算机体系结构基础 193
16.1 内存与地址 193
16.2 CPU 193
16.3 设备 196
16.4 MMU 198
16.5 Memory Hierarchy 201
第17章 x86汇编程序基础 205
17.1 最简单的汇编程序 205
17.2 x86的寄存器 208
17.3 第二个汇编程序 209
17.4 寻址方式 211
17.5 ELF文件 212
17.5.1 目标文件 213
17.5.2 可执行文件 218
第18章 汇编与C之间的关系 224
18.1 函数调用 224
18.2 main函数、启动例程和退出状态 230
18.3 变量的存储布局 237
18.4 结构体和联合体 244
18.5 C内联汇编 248
18.6 volatile限定符 250
第19章 链接详解 255
19.1 多目标文件的链接 255
19.2 定义和声明 260
19.2.1 extern和static关键字 260
19.2.2 头文件 264
19.2.3 定义和声明的详细规则 268
19.3 静态库 271
19.4 共享库 274
19.4.1 编译、链接、运行 274
19.4.2 函数的动态链接过程 281
19.4.3 共享库的命名惯例 282
19.5 虚拟内存管理 284
第20章 预处理 290
20.1 预处理的步骤 290
20.2 宏定义 291
20.2.1 函数式宏定义 291
20.2.2 内联函数 294
20.2.3 #、##运算符和可变参数 296
20.2.4 #undef预处理指示 298
20.2.5 宏展开的步骤 299
20.3 条件预处理指示 300
20.4 其他预处理特性 303
第21章 Makefile基础 306
21.1 基本规则 306
21.2 隐含规则和模式规则 313
21.3 变量 317
21.4 自动处理头文件的依赖关系 321
21.5 常用的make命令行选项 324
第22章 指针 327
22.1 指针的基本概念 327
22.2 指针类型的参数和返回值 331
22.3 指针与数组 332
22.4 指针与const限定符 335
22.5 指针与结构体 337
22.6 指向指针的指针与指针数组 337
22.7 指向数组的指针与多维数组 340
22.8 函数类型和函数指针类型 341
22.9 不完全类型和复杂声明 344
第23章 函数接口 349
23.1 本章的预备知识 349
23.1.1 strcpy与strncpy 349
23.1.2 malloc与free 354
23.2 传入参数与传出参数 358
23.3 两层指针的参数 360
23.4 返回值是指针的情况 362
23.5 回调函数 365
23.6 可变参数 368
第24章 C标准库 372
24.1 字符串操作函数 373
24.1.1 给字符串赋初值 373
24.1.2 取字符串的长度 374
24.1.3 拷贝字符串 375
24.1.4 连接字符串 377
24.1.5 比较字符串 378
24.1.6 搜索字符串 379
24.1.7 分割字符串 380
24.2 标准I/O库函数 383
24.2.1 文件的基本概念 383
24.2.2 fopen/fclose 384
24.2.3 stdin/stdout/stderr 387
24.2.4 errno与perror/strerror函数 388
24.2.5 以字节为单位的I/O函数 391
24.2.6 操作读写位置的函数 393
24.2.7 以字符串为单位的I/O函数 395
24.2.8 以记录为单位的I/O函数 397
24.2.9 格式化I/O函数 399
24.2.10 C标准库的I/O缓冲区 406
24.2.11 本节综合练习 410
24.3 数值字符串转换函数 412
24.4 分配内存的函数 414
第25章 链表、二叉树和哈希表 415
25.1 链表 415
25.1.1 单链表 415
25.1.2 双向链表 421
25.1.3 静态链表 425
25.1.4 本节综合练习 426
25.2 二叉树 426
25.2.1 二叉树的基本概念 426
25.2.2 排序二叉树 432
25.3 哈希表 437
本阶段总结 439
附录A 字符编码 442