目录 3
第1章 C语言概述 3
1.1 C语言的起源 3
1.2 C是中级语言 3
第一部分 C语言 3
1.3 C是结构化语言 4
1.4 C是面向程序员的语言 5
1.5 编译和解释 6
1.6 C程序结构 7
1.6.1 库和链接 8
1.6.2 分别编译 9
1.6.3 编译C程序 9
1.6.4 C的内存映象 9
1.7 术语 10
2.1 五种基本数据类型 12
第2章 C表达式 12
2.2 修饰基本类型 12
2.3 标识符命名 14
2.4 变量 14
2.4.1 定义变量的位置 15
2.4.2 局部变量 15
2.4.3 形式参数 17
2.4.4 全局变量 18
2.5 修饰访问类型 19
2.5.1 const 19
2.5.2 volatile 20
2.6.1 extern 21
2.6 说明存储类型 21
2.6.2 static变量 22
2.6.3 static局部变量 22
2.6.4 static全部变量 23
2.6.5 register变量 24
2.7 变量初始化 25
2.8 常量 25
2.8.1 16进制和8进制常量 26
2.8.2 串常量 26
2.8.3 反斜线字符常量 26
2.9 操作符 27
2.9.1 赋值操作符 27
2.9.2 赋值中的类型转换 27
2.9.3 多重赋值 28
2.9.4 算术操作符 29
2.9.5 增量和减量 29
2.9.6 关系和逻辑操作符 30
2.9.7 位操作符 32
2.9.9 指针操作符&和* 35
2.9.8 问号(?)操作符 35
2.9.10 编译时操作符sizeof() 37
2.9.11 逗号(,)操作符 37
2.9.12 圆点(·)和箭头(→)操作符 37
2.9.13 用作操作符的圆括号和方括号 38
2.9.14 优先级小结 38
2.10 表达式 38
2.10.1 求值顺序 39
2.10.2 表达式中的类型转换 39
2.10.3 强制类型转换 40
2.10.4 间隔和括号 41
2.10.5 C的紧凑表达手段 41
3.2 选择语句 42
第3章 程序控制语句 42
3.1 C的真值和假值 42
3.2.1 if 43
3.2.3 if-else-if梯次 44
3.2.2 嵌套if 44
3.2.4 代替if的? 46
3.2.6 switch 48
3.2.5 条件表达式 48
3.3.1 for循环 51
3.3 循环语句 51
3.3.2 for循环的变形 52
3.3.3 无限循环 55
3.3.5 while循环 56
3.3.4 无循环体的循环 56
3.3.6 do-whilw循环 58
3.4 跳转语句 59
3.4.1 return语句 59
3.4.2 goto语句 59
3.4.3 break语句 60
3.4.4 exit()函数 61
3.4.5 continue语句 62
3.5 表达式语句 62
3.6 块语句 63
第4章 数组和串 64
4.1 一维数组 64
4.3 向函数传一维数组 65
4.2 指向数组的指针 65
4.4 串 67
4.5 二维数组 68
4.5.1 字符串数组 71
4.7 指针的下标操作 72
4.6 多维数组 72
4.8 数组初始化 74
4.8.1 无尺寸数组初始化 75
4.9 一担挑游戏 76
第5章 指针 79
5.1 什么是指针 79
5.2 指针变量 79
5.3 指针操作符 80
5.4 指针表达式 81
5.4.1 指针赋值 81
5.4.2 指针算术 81
5.4.3 指针比较 82
5.5 指针和数组 84
5.5.1 指针数组 84
5.6 多级间址 85
5.7 指针初始化 86
5.8 函数指针 87
5.9 动态分配函数 89
5.9.1 动态数组 90
5.10 与指针有关的问题 93
第6章 函数 96
6.1 函数的一般形式 96
6.2 函数的作用域规则 97
6.3 函数的变元 97
6.3.1 值调用和引用调用 98
6.3.2 引用调用 98
6.3.3 用数组调用 99
6.4 main()的变元argc和argv 102
6.5 返回语句 104
6.5.1 从函数中返回 104
6.5.2 返回值 105
6.6 返回非整值的函数 106
6.7 函数原型 108
6.8 指针型函数 109
6.9 void型函数 109
6.10 main()的返回值 110
6.11 递归 110
6.13 参数声明的经典方法和现代方法 112
6.12 参数类型及数量可变的函数 112
6.14.1 参数和通用程序 113
6.14 实现问题 113
6.14.2 效率 113
6.15 库和文件 113
6.15.1 独立文件 114
6.15.2 库 114
6.15.3 程序文件的最佳尺寸 114
第7章 结构、联合、枚举和用户定义类型 115
7.1 结构 115
7.1.1 引用结构元素 117
7.1.2 结构赋值 117
7.2 结构数组 118
7.2.1 通信录实例 118
7.3 向函数传递结构 123
7.3.1 向函数传结构元素 123
7.3.2 向函数传全结构 124
7.4.2 使用结构措针 125
7.4 结构指针 125
7.4.1 声明结构指针 125
7.6 位域 127
7.5 结构中的数组和结构 127
7.7 联合 129
7.8 枚举 131
7.10 typedef 133
7.9 用sizeof确保可移植性 133
8.1 读写字符 135
第8章 控制台I/O 135
8.1.2 代替getchar()的函数 136
8.1.1 getchar()的问题 136
8.2 读写串 137
8.4.1 打印字符和串 139
8.4.2 打印数值 139
8.3 格式化控制台I/O 139
8.4 printf() 139
8.4.3 显示地址 141
8.4.6 最小域宽修饰符 141
8.4.4 格式说明符%n 141
8.4.5 格式修饰符 141
8.4.7 精度修饰符 143
8.4.8 对齐输出 143
8.4.9 处理其他数据类型 143
8.4.10 修饰符*和# 144
8.5 scanf() 144
8.5.1 格式说明符 145
8.5.2 输入数值 145
8.5.3 输入无符号整数 145
8.5.4 用scanf()读单字符 146
8.5.6 输入地址 146
8.5.5 用scanf()读串 146
8.5.7 格式符%n 147
8.5.8 使用扫描集合 147
8.5.9 过滤多余空白符 147
8.5.13 忽略输入 148
8.5.10 控制串中的非空白符 148
8.5.11 必须向scanf()传地址 148
8.5.12 格式修饰符 148
第9章 文件I/O 150
9.2 流和文件 150
9.1 ANSI C的I/O和UNIX C的I/O 150
9.4 文件 151
9.3.2 二进制流 151
9.3.1 文本流 151
9.3 流 151
9.5.1 文件指针 152
9.5 文件系统基础 152
9.5.2 打开文件 153
9.5.5 读字符 154
9.5.4 写字符 154
9.5.3 关闭文件 154
9.5.6 使用fopen()、gete()、ptuc()和felose() 155
9.5.7 使用feof() 156
9.5.8 用fputs()和fgets()处理串 157
9.5.10 ferror() 158
9.5.9 rewind() 158
9.5.12 对流清仓 160
9.6 fread()和fwrite() 160
9.5.11 删除文件 160
9.6.1 使用fread()和fwrite() 161
9.7 fseek()和随机存取I/O 165
9.8 fprintf()和fscanf() 166
9.9 标准流 167
9.9.1 控制台和文件I/O的关系 168
9.9.2 用freopen()重定向标准流 168
9.10 类UNIX文件系统 169
9.10.1 open() 170
9.10.3 creat() 170
9.10.2 close() 170
9.10.4 read和write 171
9.10.5 unlink() 172
9.10.6 用lseek()随机存取 172
第10章 C预处理程序和注释 174
10.1 C预处理程序 174
10.2 #define 174
10.4 include 176
10.3 error 176
10.5.1 #if、else、#elif和#endif 177
10.5 条件编译指令 177
10.5.2 #ifdef和#ifndef 179
10.6 #undef 179
10.7 #line 180
10.8 #pragma 180
10.9 预处理操作符#和## 181
10.10 预定义宏 181
10.11 注解 182
第二部分 C标准库 185
第11章 链接、库和包含文件 185
11.1 链接程序 185
11.1.1 分别编译 185
11.1.2 可重定位代码 186
11.1.3 覆盖链接 187
11.3 包含文件 188
11.2.1 库和目标码文件 188
11.2 C标准库 188
11.3.1 包含文件中的宏 189
11.4 重新定义库函数 190
第12章 I/O函数 191
第13章 串和字符函数 231
第14章 数学函数 251
第15章 时间、日期和其它与操作系统有关的函数 262
第16章 动态分配函数 297
第17章 显示和图形函数 311
第18章 杂函数 333
第19章 排序和查找 355
第三部分 算法和应用 355
19.1 排序 355
19.1.1 排序算法的分类 355
19.1.2 排序算法的评价 356
19.1.3 气泡浮起排序 356
19.1.4 选择排序 359
19.1.5 插入排序 360
19.1.6 改进的排序 361
19.1.7 谢尔排序 361
19.1.8 快速排序 363
19.2 选择排序算法 365
19.3 对其它数据结构排序 365
19.3.1 对串排序 365
19.3.2 对结构排序 366
19.4 对随机存取的磁盘文件排序 367
19.5 查找 369
19.5.1 查找方法 369
19.5.2 顺序查找 369
19.5.3 对分查找 370
20.1 队列 371
第20章 队列、堆栈、链表和树 371
20.2 循环队列 375
20.3 堆栈 377
20.4 链表 381
20.5 单向链表 381
20.6 双向链表 385
20.7 通信录实例 388
20.8 二叉树 393
第21章 稀疏数组 399
21.1 链表方法 399
21.1.1 链表方法的性能分析 402
21.2 二叉树方法 402
21.2.1 二叉树方法的性能分析 403
21.3 指针数组方法 404
21.3.1 指针数组方法的性能分析 406
21.4 散列方法 406
24.4.1 散列方法的性能分析 409
21.5 决策 409
22.1 表达式 411
第22章 表达式分析和求值 411
22.2 表达式分解 412
22.3 表达式分析 414
22.4 简单分析程序 415
22.5 能处理变量的分析程序 419
22.6 递归下降分析中的语法检查 425
第23章 人工智能问题求解 427
23.1 表示和术语 427
23.2 组合爆炸 428
23.3 搜索技术 429
23.4 评价搜索技术 429
23.5 用图表示问题 431
23.6 深度优先搜索 432
23.7 宽度优先搜索 439
23.6.1 深度优先算法的性能分析 439
23.7.1 宽度优先搜索的性能分析 440
23.8 启发式搜索 441
23.9 登山搜索 442
23.9.1 登山搜索的性能分析 446
23.10 最小代价搜索 446
23.10.1 最小代价搜索的性能分析 447
23.11 选择搜索方法 448
23.12 寻找多重解 448
23.12.1 路径剪除 448
23.12.2 结点摘除 449
23.13 寻找“最优”解 453
23.14 一个例子 457
24.1 8086处理器系列 461
第24章 使用系统资源 461
24.2 8086中断和DOS 462
24.3 通过BIOS使用系统资源 464
24.3.1 改变显示方式 467
24.3.2 清显示屏 468
24.3.3 光标定位 468
24.3.4 使用PC键盘的扫描码 469
24.4 用DOS调用系统功能 470
24.4.1 检查键盘状态 472
24.4.3 读/写串口 472
24.4.2 使用打印机 472
24.5 一些建议 473
24.4.4 列目录 473
25.1 方式和调色板 474
第25章 图形 474
25.2 写象素 475
25.2.1 用ROM-BIOS写象素 475
25.2.2 直接写象素 476
25.3 画线 478
25.4 框和填充 481
25.5 组合实例 483
第四部分 C语言软件开发 493
第26章 汇编语言子程序接口 493
26.1 汇编语言接口 493
26.2 C编译程序的调用规则 494
26.3 Microsoft C的调用规则 494
26.4 生成汇编码函数 494
26.4.1 简单汇编码程序 495
26.4.2 参引调用实例 499
26.4.3 代码和数据段的大模式 500
26.5 生成汇编码骨架 501
26.6 使用asm 504
26.7 使用汇编码的时机 504
第27章 C语言软件工程 506
27.1 自顶向下设计 506
27.1.1 构造程序草案 506
27.1.2 选择数据结构 507
27.2 抗毁函数 508
27.4.1 LINT 509
27.4 LINT和MAKE 509
27.3 函数原型 509
27.4.2 MAKE 510
第28章 效率、移植和调试 514
28.1 效率 514
28.1.1 增量和减量操作符 514
28.1.2 寄存器变量 515
28.1.3 指针和数组索引 516
28.1.4 函数的用法 517
28.2 移植 519
28.2.1 使用#define 519
28.2.2 对操作系统的依赖 520
28.2.3 数据尺寸的差异 520
28.3 调试 521
28.3.1 处理顺序错 521
28.3.2 指针问题 522
28.3.3 奇异语法错 523
28.3.5 越界错 524
28.3.4 出界错 524
28.3.6 函数原型遗漏 525
28.3.7 变元错 526
28.3.8 堆-栈冲突 527
28.3.9 一般调试理论 527
28.4 程序维护的艺术 528
28.4.1 改错 528
28.4.2 保护源代码 529
第五部分 C的新方向C++ 533
第29章 C++ 533
29.1 数据抽象 533
29.2 对象 534
29.3 注释 535
29.4 类 535
29.4.1 声明成员函数 536
29.4.2 构造函数和析构函数 538
29.4.3 友元 540
29.5 函数重载 541
29.6 操作符重载 542
29.6.1 数据抽象和操作符重载 544
29.7 C++的其它特性 545
29.7.1 new和delete 545
29.7.2 inline 545
附录 ANSI标准C和K&R C之间的差别 547
A.1 删除关键字 547
A.2 扩充关键字 547
A.3 结构传递 549
A.4 函数原型 549
A.5 函数的现代声明和经典声明 549
A.6 标准库 550
A.7 扩充预处理指令 550