图书目录

目录

第1章 C程序设计简介 1

1.1 计算机系统结构概述 1

1.1.1 计算机语言发展概述 2

1.1.2 C语言起源和发展历程 3

1.2 C语言特性和应用场景 4

1.2.1 C语言特性 4

1.2.2 C语言应用场景 5

1.3 C语言安全编程思考 5

1.3.1 安全思考 5

1.3.2 安全实现 6

1.4 简单实例 7

1.4.1 编写一个计算机程序的过程 7

1.4.2 实例 8

1.4.3 程序结构介绍 9

1.5 编译机制 11

1.5.1 编译与链接 11

1.5.2 进程在内存中的布局 14

1.6 编程规范 15

1.7 调试 18

1.7.1 错误和警告 18

1.7.2 C语言GDB介绍 19

1.7.3 C语言中的调试 21

1.8 本章小结 23

习题 23

第2章 数据类型与运算 24

2.1 变量和常量 24

2.1.1 关键字 24

2.1.2 变量 25

2.1.3 常量 26

2.1.4 作用域和生命周期 28

2.2 基本数据类型 30

2.2.1 数据类型 30

2.2.2 存储形式 32

2.2.3 字符型及其存储 33

2.3 运算 34

2.3.1 算术运算符和赋值运算符 34

2.3.2 关系运算符和逻辑运算符 36

2.3.3 位运算符 37

2.3.4 三目运算符 38

2.3.5 运算符优先级和求值顺序 39

2.4 数据类型转换 39

2.4.1 自动类型转换 40

2.4.2 强制类型转换 40

2.5 安全缺陷 41

2.5.1 自动数据类型转换的安全缺陷 41

2.5.2 运算的安全缺陷 42

2.6 本章小结 43

习题 43

第3章 基本程序设计 45

3.1 结构化程序设计 45

3.1.1 结构化程序设计的基本思想 46

3.1.2 三种基本结构 47

3.2 语句 48

3.2.1 表达式语句 48

3.2.2 读写字符 49

3.2.3 块语句 49

3.2.4 跳转语句 50

3.2.5 其他控制语句 50

3.3 控制台I/O 51

3.3.1 格式化控制台输出 51

3.3.2 格式化控制台输入 54

3.3.3 文件操作 56

3.4 程序原型 58

3.4.1 程序样式 58

3.4.2 程序书写风格 59

3.4.3 程序布局与规范 59

3.5 编写简单的C程序 59

3.6 本章小结 61

习题 61

第4章 程序流程控制 62

4.1 控制流程的条件判断 62

4.2 选择结构 64

4.2.1 if单/双分支语句 64

4.2.2 if多分支语句与if嵌套 66

4.2.3 switch多分支语句 68

4.3 循环结构 70

4.3.1 用while语句实现循环结构 70

4.3.2 用do-while语句实现循环结构 73

4.3.3 用for语句实现循环结构 75

4.3.4 嵌套循环结构 78

4.3.5 break语句和continue语句 80

4.4 程序流程控制的综合案例 84

4.5 流程控制的安全缺陷 85

4.6 本章小结 89

习题 89

第5章 函数 91

5.1 函数与程序模块化 91

5.1.1 函数的含义 91

5.1.2 程序的模块化 92

5.2 函数的定义 93

5.2.1 函数的分类 93

5.2.2 函数的声明 94

5.2.3 函数体的定义 95

5.3 函数调用 96

5.3.1 函数调用形式 96

5.3.2 函数的参数 98

5.3.3 函数的返回值 98

5.4 函数嵌套和递归 99

5.4.1 函数的嵌套调用 100

5.4.2 函数的递归调用 101

5.5 变量的作用域 106

5.5.1 局部变量 106

5.5.2 全局变量 107

5.5.3 同名变量 108

5.6 变量的存储类别 108

5.6.1 自动变量 109

5.6.2 寄存器变量 109

5.6.3 外部变量  110

5.6.4 静态变量 110

5.7 编译预处理 111

5.7.1 宏 112

5.7.2 条件编译 113

5.7.3 内部函数和外部函数 114

5.7.4 头文件 114

5.8 安全缺陷分析 117

5.9 本章小结 118

习题 118

第6章 数组 119

6.1 一维数组 119

6.1.1 一维数组的定义和初始化 119

6.1.2 一维数组的引用 121

6.1.3 一维数组元素的输入和输出 122

6.2 二维数组 128

6.2.1 二维数组的定义和存储 129

6.2.2 二维数组的初始化 130

6.2.3 二维数组常用操作 130

6.3 字符数组和字符串 134

6.3.1 用字符数组表示字符串 135

6.3.2 字符数组的初始化 136

6.3.3 字符数组元素的输入输出 137

6.3.4 字符串处理函数 139

6.4 数组作为函数的参数 144

6.5 数组的安全缺陷 147

6.5.1 数组越界访问内存 147

6.5.2 缓冲区溢出 148

6.5.3 未初始化数组  148

6.5.4 字符串的相关安全 149

6.5.5 数组名的相关安全 149

6.6 本章小结 149

习题 150

第7章 指针 152

7.1 指针的含义   152

7.1.1 变量地址 152

7.1.2 指针与地址 154

7.2 指针变量 156

7.2.1 指针变量的声明 156

7.2.2 指针变量的赋值和使用 156

7.2.3 指针变量形参 158

7.3 指针运算 159

7.3.1 指针赋值运算 160

7.3.2 指针算术运算 160

7.3.3 指针比较 161

7.3.4 指针转换 164

7.4 指针和数组 165

7.4.1 数组元素的指针表示 166

7.4.2 指针数组 169

7.4.3 字符串的指针表示 169

7.4.4 数组形参 171

7.5 指针与函数 173

7.5.1 函数指针 173

7.5.2 回调函数 175

7.5.3 返回指针的函数 176

7.6 动态内存分配 177

7.6.1 动态内存的管理 177

7.6.2 动态分配的数组 178

7.7 多级指针 179

7.7.1 多级指针与多维数组 180

7.7.2 数组指针 181

7.7.3 命令行参数 182

7.7.4 变长数组 183

7.8 指针的安全缺陷 186

7.8.1 指针非法访问 186

7.8.2 动态内存缺陷 188

7.9 本章小结 189

习题 190

第8章 复合数据类型 191

8.1 结构类型 191

8.1.1 定义结构类型 191

8.1.2 定义结构类型变量 192

8.1.3 结构类型变量的初始化 194

8.1.4 结构类型变量的引用 195

8.2 向函数传递结构 196

8.2.1 向函数传递结构类型成员 197

8.2.2 向函数传递全结构 197

8.3 结构数组 198

8.4 结构与指针 200

8.4.1 结构指针 201

8.4.2 结构类型的自引用定义 201

8.4.3 动态数据结构 201

8.4.4 链表的概念和分类 202

8.4.5 单链表的基本操作 203

8.5 位段 209

8.6 联合类型 210

8.6.1 定义联合类型变量 210

8.6.2 联合类型变量的引用 212

8.7 枚举类型 212

8.7.1 定义枚举类型变量 212

8.7.2 枚举类型变量的引用 213

8.8 typedef定义类型别名 213

8.9 安全缺陷分析 213

8.10 本章小结 214

习题 215

第9章 多文件项目 216

9.1 程序设计实例 216

9.1.1 程序设计样例概述 216

9.1.2 程序清单(部分) 217

9.2 多文件工程 224

9.2.1 模块划分 226

9.2.2 作用域 227

9.2.3 预处理器 228

9.2.4 多文件工程编译和链接 233

9.3 make和makefile 234

9.3.1 make简介 234

9.3.2 makefile文件的编写 235

9.4 软件测试 237

9.4.1 测试重点 238

9.4.2 测试用例 238

9.5 代码规范 239

9.5.1 变量、函数、文件命名规范 239

9.5.2 编码风格规范 240

9.6 编码中的安全思维 241

9.6.1 整数运算 241

9.6.2 分支与循环 243

9.6.3 数组 243

9.6.4 指针 244

9.6.5 复合数据类型 245

9.6.6 函数调用 245

9.7 本章小结 246

习题 246

附录A 转义字符 247

附录B ASCII码表 247

附录C 字符串函数 249

附录D 时间函数 250

附录E 随机数产生器函数 250

参考文献 251