第1章 概论 1
1.1 C语言的发展与特点 1
1.1.1 C语言发展简史 1
1.1.2 C语言的特点 2
1.2 第一个C程序 3
1.2.1 第一个C程序及其编译与运行 3
1.2.2 关于C程序的编写 6
1.2.3 C程序的结构 7
1.3 本书提供的C语言应用实例介绍 10
1.3.1 概述 10
1.3.2 本书部分应用举例 11
习题1 13
第2章 C语言基础 15
2.1 字符集、标识符与关键词 15
2.1.1 字符集 15
2.1.2 标识符 15
2.1.3 关键词 16
2.2 数据类型 16
2.2.1 基本数据类型 17
2.2.2 其他数据类型 18
2.3 常量与变量 18
2.3.1 常量 18
2.3.2 变量 22
2.4 运算符与表达式 25
2.4.1 赋值运算符与表达式 25
2.4.2 算术运算符与表达式 27
2.4.3 关系运算符与表达式 29
2.4.4 逻辑运算符与表达式 30
2.4.5 逗号运算符与表达式 32
2.4.6 复合运算与表达式 34
2.4.7 运算符优先级 34
2.5 数据输入/输出函数与常用函数 36
2.5.1 数据输入/输出函数 36
2.5.2 字符输入/输出函数 40
2.5.3 常用函数 41
习题2 44
第3章 程序控制流与程序算法设计 47
3.1 顺序结构 47
3.1.1 顺序结构的基本语句 48
3.1.2 顺序结构应用举例 49
3.2 选择结构 52
3.2.1 if语句 52
3.2.2 条件表达式 56
3.2.3 switch语句 57
3.3 循环结构 59
3.3.1 while循环 59
3.3.2 do-while循环 62
3.3.3 for循环 63
3.3.4 循环语句的嵌套 66
3.3.5 break语句和continue语句 67
3.3.6 goto语句 68
3.4 算法 68
3.4.1 算法概述 68
3.4.2 算法描述方法 71
3.5 程序设计方法 77
3.5.1 程序设计的一般步骤 77
3.5.2 结构化程序设计方法 77
习题3 79
第4章 函数 83
4.1 函数声明与定义 83
4.1.1 概述 83
4.1.2 函数声明 86
4.1.3 函数定义 88
4.2 函数调用 89
4.2.1 传值调用的特点 89
4.2.2 函数调用方式 91
4.2.3 函数嵌套调用 92
4.2.4 函数递归和递推调用 94
4.3 函数与变量 97
4.3.1 全局变量和局部变量 98
4.3.2 变量的生命期与存储类别 100
习题4 103
第5章 数组与字符串 108
5.1 一维数组 108
5.1.1 一维数组定义 108
5.1.2 一维数组引用 109
5.1.3 数组元素的排序与查找 111
5.2 二维数组 116
5.2.1 二维数组定义 116
5.2.2 二维数组引用 118
5.2.3 二维数组程序举例 120
5.3 字符串 120
5.3.1 字符串的存储 121
5.3.2 字符串的输入与输出 122
5.3.3 常用字符串函数 124
5.4 数组与函数 127
5.4.1 数组元素作为函数参数 127
5.4.2 数组名作为函数参数 127
习题5 128
第6章 指针与动态内存分配 133
6.1 指针基础 133
6.1.1 指针变量定义 133
6.1.2 指针变量初始化 134
6.1.3 指针的间接引用 135
6.1.4 指针基本运算 136
6.2 指针与数组 140
6.2.1 指向数组元素的指针 140
6.2.2 通过指针引用数组元素 142
6.2.3 数组名作函数参数 143
6.2.4 指针数组 145
6.2.5 指向指针的指针 145
6.2.6 指针数组与二级指针的等价性 149
6.3 指针与字符串 150
6.3.1 字符串的表示形式 150
6.3.2 字符串指针作函数参数 151
6.3.3 常用字符串函数 152
6.4 指针与函数 153
6.4.1 指针作函数的参数 153
6.4.2 指针作函数返回值 157
6.4.3 指向函数的指针 158
6.4.4 函数指针作函数的参数 160
6.5 const指针 161
6.5.1 指向常量的指针 161
6.5.2 指针常量 162
6.5.3 指向常量的指针常量 162
6.6 动态内存分配 163
6.6.1 用malloc()分配内存空间 163
6.6.2 动态数组的实现 165
习题6 167
第7章 结构体、共用体和枚举类型 171
7.1 结构体类型 171
7.1.1 结构体类型及其变量的定义 171
7.1.2 结构体变量的使用 174
7.1.3 结构体变量的初始化 175
7.2 结构体数组 177
7.2.1 结构体数组的定义 177
7.2.2 结构体数组的初始化 177
7.3 结构体指针变量 178
7.3.1 指向结构体的指针 179
7.3.2 指向结构体数组的指针 180
7.3.3 结构体变量和结构体指针变量作函数参数 181
7.4 链表 183
7.4.1 链表概述 183
7.4.2 链表的基本操作 183
7.5 共用体 188
7.5.1 共用体类型的定义 188
7.5.2 共用体类型变量的定义 189
7.5.3 共用体变量的使用 189
7.6 枚举类型 190
习题7 192
第8章 输入/输出与文件 195
8.1 概述 195
8.1.1 C语言文件的概念 196
8.1.2 文本文件和二进制文件 197
8.1.3 文件类型指针 198
8.2 文件打开与关闭 198
8.2.1 打开文件 198
8.2.2 关闭文件 200
8.2.3 文件缓冲区的控制 201
8.2.4 文件状态检测 203
8.3 文本文件读/写 204
8.3.1 按字符读/写 204
8.3.2 按字符串读/写 206
8.3.3 格式化读/写 208
8.4 二进制文件读/写 210
8.4.1 写入二进制文件 210
8.4.2 读出二进制文件 212
8.5 文件定位与随机存取 213
8.5.1 文件定位 214
8.5.2 随机读/写 215
习题8 216
第9章 位运算及其应用 220
9.1 概述 220
9.1.1 位与字节 220
9.1.2 位序列的输出 223
9.2 位运算符及其使用方法 224
9.2.1 按位取反运算 224
9.2.2 按位左移运算 226
9.2.3 按位右移运算 228
9.2.4 按位与运算 229
9.2.5 按位或运算 232
9.2.6 按位异或运算 234
9.2.7 复合位运算符 237
9.3 位运算应用举例 237
9.3.1 位运算用于分离IP地址 237
9.3.2 均匀二分查找 239
9.3.3 二进制GCD算法 241
9.3.4 在计算机密码学中的应用 242
9.3.5 在数据压缩中的应用 246
习题9 251
第10章 算法设计与分析 254
10.1 穷举法 254
10.1.1 百钱百鸡问题 254
10.1.2 提高穷举效率 255
10.1.3 局部穷举 260
10.2 分治法 263
10.2.1 二分法求解方程 263
10.2.2 快速排序法 265
10.3 回溯法 268
10.3.1 递归回溯法 269
10.3.2 非递归回溯法 273
10.4 贪心算法 274
10.4.1 旅行商问题 275
10.4.2 删数问题 277
10.5 再论递归与递推算法 279
10.5.1 递归和递推的效率 279
10.5.2 递归算法非递归化 282
10.6 大整数相加算法 284
10.6.1 大整数相加算法设计与实现 284
10.6.2 大Fibonacci数的计算 289
习题10 291
第11章 图形与图像编程 296
11.1 概述 296
11.1.1 Win32 API简介 296
11.1.2 Windows应用程序的数据类型 297
11.2 Windows应用程序结构 298
11.2.1 WinMain函数 298
11.2.2 WndProc窗口函数 302
11.3 图形编程 303
11.3.1 创建图形编程空工程 303
11.3.2 编写窗口程序 304
11.3.3 编写图形程序 306
11.3.4 常用图形函数介绍 306
11.3.5 图形编程实例 308
11.3.6 图形动画 317
11.4 图像编程 320
11.4.1 RAW图像数据及其显示 320
11.4.2 PGM和PPM图像显示和存储 324
习题11 331
第12章 编译预处理与程序调试 334
12.1 编译预处理概述 334
12.1.1 预处理指令 334
12.1.2 文件包含 335
12.2 宏定义与宏替换 336
12.2.1 对象式宏 336
12.2.2 函数式宏 336
12.3 条件编译 338
12.3.1 条件指令#if、#else、#elif、#endif的使用 338
12.3.2 条件指令#ifdef、#ifndef的使用 340
12.4 调试语法错误 341
12.4.1 常见语法错误与警告的英文解释 342
12.4.2 常见语法错误 342
12.5 调试连接错误 348
12.6 调试逻辑算法错误 349
12.6.1 调试方法 349
12.6.2 常见逻辑错误 353
12.6.3 调试方法总结 355
12.7 运行错误 356
习题12 357
附录A ASCII字符代码 359
附录B C语言常用库函数 360
参考文献 364