第1章 为什么要学C语言 1
1.1 引言 1
1.2 游戏、黑客和C语言 1
1.3 C语言,不老的传说 4
1.4 C语言的爱与恨 5
1.5 C语言教给我们的事 6
1.6 什么是“编程” 7
1.7 本章小结 8
习题1 8
第2章 C数据类型 9
2.1 常量与变量 9
2.1.1 常量 9
2.1.2 变量 11
2.2 简单的屏幕输出 13
2.3 数据类型 14
2.4 如何计算变量或数据类型所占内存空间的大小 16
2.5 变量的赋值和赋值运算符 18
2.6 本章扩充内容 19
2.7 本章知识点小结 22
2.8 本章常见错误小结 23
习题2 23
本章实验题 24
第3章 简单的算术运算和表达式 25
3.1 C运算符和表达式 25
3.1.1 算术运算符和表达式 25
3.1.2 复合的赋值运算符 28
3.1.3 增1和减1运算符 29
3.2 宏常量与宏替换 31
3.3 const常量 34
3.4 自动类型转换与强制类型转换运算符 35
3.5 常用的标准数学函数 38
3.6 本章知识点小结 40
3.7 本章常见错误小结 41
习题3 42
本章实验题 43
第4章 键盘输入和屏幕输出 44
4.1 单个字符的输入/输出 44
4.1.1 字符常量 44
4.1.2 字符的输入/输出 45
4.2 数据的格式化屏幕输出 47
4.3 数据的格式化键盘输入 50
4.4 本章扩充内容 54
4.5 本章知识点小结 57
4.6 本章常见错误小结 58
习题4 59
本章实验题 61
第5章 选择控制结构 62
5.1 生活中与计算机中的问题求解方法 62
5.2 算法的概念及其描述方法 64
5.2.1 算法的概念 64
5.2.2 算法的描述方法 65
5.3 关系运算符与关系表达式 66
5.4 用于单分支控制的条件语句 68
5.5 用于双分支控制的条件语句 69
5.6 条件运算符和条件表达式 69
5.7 用于多分支控制的条件语句 70
5.8 用于多路选择的switch语句 75
5.9 逻辑运算符和逻辑表达式 80
5.10 本章扩充内容 83
5.10.1 程序测试 83
5.10.2 对输入非法字符的检查与处理 92
5.10.3 位运算符 95
5.11 本章知识点小结 98
5.12 本章常见错误小结 99
习题5 101
本章实验题 102
第6章 循环控制结构 104
6.1 循环控制结构与循环语句 104
6.2 计数控制的循环 114
6.3 条件控制的循环 116
6.4 嵌套循环 126
6.5 流程的转移控制 133
6.5.1 goto语句 133
6.5.2 break语句 133
6.5.3 continue语句 135
6.5.4 函数exit() 137
6.6 本章扩充内容 140
6.6.1 结构化程序设计的核心思想 140
6.6.2 常用的程序调试与排错方法 141
6.6.3 类型溢出 142
6.7 本章知识点小结 144
6.8 本章常见错误小结 145
习题6 146
本章实验题 152
第7章 函数 155
7.1 分而治之与信息隐藏 155
7.2 函数的定义 156
7.2.1 函数的分类 156
7.2.2 函数的定义 157
7.3 向函数传递值和从函数返回值 158
7.3.1 函数调用 158
7.3.2 函数原型 160
7.3.3 函数封装与防御性程序设计 162
7.3.4 函数设计的基本原则 171
7.4 递归函数 171
7.4.1 递归问题的提出 171
7.4.2 递归函数 174
7.5 变量的作用域和存储类型 179
7.5.1 变量的作用域 179
7.5.2 变量的存储类型 181
7.6 模块化程序设计 189
7.6.1 模块分解的基本原则 189
7.6.2 自顶向下、逐步求精 189
7.6.3 模块化程序设计实例 191
7.7 本章扩充内容 197
7.8 本章知识点小结 200
7.9 本章常见错误小结 201
习题7 202
本章实验题 205
第8章 数组 206
8.1 一维数组的定义和初始化 206
8.2 二维数组的定义和初始化 211
8.3 向函数传递一维数组 215
8.4 排序和查找 220
8.5 向函数传递二维数组 234
8.6 本章知识点小结 238
8.7 本章常见错误小结 239
习题8 240
本章实验题 247
第9章 指针 248
9.1 变量的内存地址 248
9.2 指针变量的定义和初始化 249
9.3 间接寻址运算符 253
9.4 按值调用与按地址调用 255
9.5 用指针变量作函数参数的程序实例 261
9.6 函数指针及其应用 264
9.7 本章知识点小结 273
9.8 本章常见错误小结 273
习题9 274
本章实验题 276
第10章 字符串 278
10.1 字符串常量 278
10.2 字符串的存储 278
10.3 字符指针 280
10.4 字符串的访问和输入/输出 281
10.4.1 如何访问字符串中的单个字符 281
10.4.2 字符串的输入/输出 281
10.5 字符串处理函数 286
10.6 向函数传递字符串 290
10.7 本章扩充内容 294
10.7.1 从函数返回字符串指针 294
10.7.2 const类型限定符 297
10.7.3 字符处理函数 298
10.7.4 数值字符串向数值的转换 304
10.8 本章知识点小结 306
10.9 本章常见错误小结 306
习题10 308
本章实验题 310
第11章 指针和数组 312
11.1 指针和一维数组间的关系 312
11.2 指针和二维数组间的关系 319
11.3 指针数组及其应用 326
11.3.1 指针数组用于表示多个字符串 326
11.3.2 指针数组用于表示命令行参数 333
11.4 本章扩充内容 334
11.4.1 C程序的内存映像 334
11.4.2 动态内存分配函数 335
11.4.3 长度可变的一维动态数组 337
11.4.4 长度可变的二维动态数组 339
11.4.5 常见的内存错误及其对策 341
11.4.6 缓冲区溢出攻击 351
11.5 本章知识点小结 353
11.6 本章常见错误小结 354
习题11 354
本章实验题 358
第12章 结构体和共用体 360
12.1 从基本数据类型到抽象数据类型 360
12.2 结构体的定义 361
12.2.1 为什么要定义结构体类型 361
12.2.2 结构体变量的定义 363
12.2.3 用typedef定义数据类型 365
12.2.4 结构体变量的初始化 366
12.2.5 嵌套的结构体 366
12.2.6 结构体变量的引用 368
12.2.7 结构体所占内存的字节数 372
12.3 结构体数组的定义和初始化 373
12.3.1 结构体数组的定义 373
12.3.2 结构体数组的初始化 374
12.4 结构体指针的定义和初始化 376
12.4.1 指向结构体变量的指针 376
12.4.2 指向结构体数组的指针 377
12.5 向函数传递结构体 377
12.6 共用体 384
12.7 本章扩充内容 387
12.7.1 枚举数据类型 387
12.7.2 动态数据结构——单向链表 388
12.8 本章知识点小结 398
12.9 本章常见错误小结 399
习题12 400
本章实验题 401
第13章 文件操作 403
13.1 二进制文件和文本文件 403
13.2 文件的打开和关闭 405
13.3 按字符读写文件 406
13.4 按格式读写文件 413
13.5 按数据块读写文件 419
13.6 本章扩充内容 424
13.6.1 文件的随机读写 424
13.6.2 标准输入/输出重定向 427
13.7 本章知识点小结 428
13.8 本章常见错误小结 429
习题13 429
本章实验题 429
附录A C关键字 432
附录B Visual C++下基本数据类型的取值范围 433
附录C C运算符的优先级与结合性 434
附录D 常用字符与ASCII值对照表 435
参考文献 437