第1章 为什么要学习编程 1
1.1 学习编程的热潮 1
1.1.1 席卷全球的“编程一小时” 1
1.1.2 资本汹涌的少儿编程 2
1.1.3 “再不学编程就晚了” 2
1.2 为什么要学编程 3
1.3 什么是“编程” 5
1.4 怎么学编程 6
1.4.1 一切都是计算 6
1.4.2 学编程不是学语法 6
1.4.3 动手,动手,再动手 7
1.5 本章小结 7
习题1 7
第2章 基本数据类型 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 本章常见错误小结 22
习题2 23
第3章 基本算术运算 24
3.1 C运算符和表达式 24
3.1.1 算术运算符和表达式 24
3.1.2 复合的赋值运算符 27
3.1.3 增1和减1运算符 28
3.2 宏常量与宏替换 30
3.3 const常量 32
3.4 自动类型转换与强制类型转换运算符 33
3.5 常用的标准数学函数 35
3.6 本章知识点小结 37
3.7 本章常见错误小结 37
习题3 38
第4章 键盘输入和屏幕输出 40
4.1 单个字符的输入/输出 40
4.1.1 字符常量 40
4.1.2 字符的输入/输出 41
4.2 数据的格式化屏幕输出 43
4.3 数据的格式化键盘输入 46
4.4 本章扩充内容 50
4.4.1 用`输入字符时存在的问题 50
4.4.2 `格式符存在问题的解决方法 52
4.5 本章知识点小结 54
4.6 本章常见错误小结 54
习题4 55
第5章 选择控制结构 58
5.1 生活中与计算机中的问题求解方法 58
5.2 算法的概念及其描述方法 59
5.2.1 算法的概念 59
5.2.2 算法的描述方法 60
5.3 关系运算符与关系表达式 61
5.4 用于单分支控制的条件语句 63
5.5 用于双分支控制的条件语句 64
5.6 条件运算符和条件表达式 65
5.7 用于多分支控制的条件语句 65
5.8 用于多路选择的switch语句 71
5.9 逻辑运算符和逻辑表达式 75
5.10 本章扩充内容 78
5.10.1 程序测试 78
5.10.2 对输入非法字符的检查与处理 87
5.10.3 位运算符 90
5.11 本章知识点小结 93
5.12 本章常见错误小结 93
习题5 95
第6章 循环控制结构 98
6.1 循环控制结构与循环语句 98
6.2 计数控制的循环 107
6.3 嵌套循环 110
6.4 条件控制的循环 113
6.5 流程的转移控制 124
6.5.1 goto语句 124
6.5.2 break语句 124
6.5.3 continue语句 126
6.5.4 穷举法编程实例 128
6.6 本章扩充内容 131
6.6.1 结构化程序设计的核心思想 131
6.6.2 常用的程序调试与排错方法 132
6.6.3 类型溢出 133
6.7 本章知识点小结 135
6.8 本章常见错误小结 135
习题6 136
第7章 函数与模块化程序设计 143
7.1 分而治之与信息隐藏 143
7.2 函数的定义 144
7.2.1 函数的分类 144
7.2.2 函数的定义 145
7.3 向函数传递值和从函数返回值 146
7.3.1 函数调用 146
7.3.2 函数原型 148
7.3.3 函数封装与防御性程序设计 150
7.3.4 函数设计的基本原则 157
7.4 函数的递归调用和递归函数 158
7.5 变量的作用域和生存期 161
7.5.1 变量的作用域 161
7.5.2 变量的生存期 166
7.6 模块化程序设计 170
7.6.1 模块分解的基本原则 170
7.6.2 自顶向下、逐步求精 171
7.6.3 模块化程序设计与多文件编程实例 172
7.6.4 条件编译 180
7.7 本章扩充内容——代码风格 180
7.8 本章知识点小结 183
7.9 本章常见错误小结 183
习题7 184
第8章 数组和算法基础 189
8.1 一维数组的定义和初始化 189
8.2 二维数组的定义和初始化 193
8.3 向函数传递一维数组 197
8.4 排序和查找 203
8.5 向函数传递二维数组 215
8.6 本章知识点小结 220
8.7 本章常见错误小结 220
习题8 221
第9章 指针 227
9.1 变量的内存地址 227
9.2 指针变量的定义和初始化 228
9.3 间接寻址运算符 232
9.4 按值调用与模拟按引用调用 234
9.5 用指针变量作函数参数的程序实例 240
9.6 函数指针及其应用 243
9.7 本章知识点小结 251
9.8 本章常见错误小结 251
习题9 252
第10章 字符串 255
10.1 字符串字面量 255
10.2 字符串的存储 255
10.3 字符指针 257
10.4 字符串的访问和输入/输出 258
10.4.1 如何访问字符串中的单个字符 258
10.4.2 字符串的输入/输出 258
10.5 字符串处理函数 263
10.6 向函数传递字符串 266
10.7 从函数返回字符串指针 270
10.8 本章扩充内容 273
10.8.1 const类型限定符 273
10.8.2 字符处理函数 274
10.8.3 数值字符串向数值的转换 279
10.9 本章知识点小结 280
10.10 本章常见错误小结 281
习题10 282
第11章 指针和数组 285
11.1 指针和一维数组间的关系 285
11.2 指针和二维数组间的关系 293
11.3 指针数组及其应用 300
11.3.1 指针数组用于表示多个字符串 300
11.3.2 指针数组用于表示命令行参数 306
11.4 动态数组 308
11.4.1 C程序的内存映像 308
11.4.2 动态内存分配函数 309
11.4.3 长度可变的一维动态数组 311
11.4.4 长度可变的二维动态数组 313
11.5 本章扩充内容 315
11.5.1 常见的内存错误及其对策 315
11.5.2 缓冲区溢出攻击 323
11.6 本章知识点小结 326
11.7 本章常见错误小结 326
习题11 327
第12章 结构体和数据结构基础 331
12.1 从基本数据类型到抽象数据类型 331
12.2 结构体的定义 332
12.2.1 为什么要定义结构体类型 332
12.2.2 结构体变量的定义 334
12.2.3 用typedef定义数据类型 336
12.2.4 结构体变量的初始化 337
12.2.5 嵌套的结构体 338
12.2.6 结构体变量的引用 339
12.2.7 结构体所占内存的字节数 343
12.3 结构体数组的定义和初始化 345
12.3.1 结构体数组的定义 345
12.3.2 结构体数组的初始化 345
12.4 结构体指针的定义和初始化 347
12.4.1 指向结构体变量的指针 347
12.4.2 指向结构体数组的指针 348
12.5 向函数传递结构体 348
12.6 共用体 355
12.7 枚举数据类型 359
12.8 动态数据结构——单向链表 360
12.8.1 问题的提出 360
12.8.2 链表的定义 361
12.8.3 单向链表的建立 362
12.8.4 单向链表的删除操作 366
12.8.5 单向链表的插入操作 367
12.9 本章扩充内容 370
12.9.1 栈和队列 370
12.9.2 树和图 382
12.9.3 数据的逻辑结构和存储结构 390
12.10 本章知识点小结 392
12.11 本章常见错误小结 392
习题12 393
第13章 文件操作 394
13.1 二进制文件和文本文件 394
13.2 文件的打开和关闭 396
13.3 按字符读写文件 397
13.4 按格式读写文件 404
13.5 按数据块读写文件 410
13.6 本章扩充内容 415
13.6.1 文件的随机读写 415
13.6.2 标准输入/输出重定向 418
13.7 本章知识点小结 420
13.8 本章常见错误小结 420
习题13 420
第14章 简单的游戏设计 422
14.1 动画的基本原理 422
14.2 迷宫游戏 423
14.3 Flappy bird游戏 430
14.4 本章知识点小结 437
14.5 本章常见错误小结 437
习题14 437
附录A C关键字 439
附录B GCC中基本数据类型的取值范围 440
附录C C运算符的优先级与结合性 441
附录D 常用字符与ASCII码值对照表 442
附录E 常用的ANSI C标准库函数 445
参考文献 453