目 录
第 1章 看不见的错误输入 1
1-1 看不见的错误 2
看不见的错误 2
难以察觉的错误 3
容易忽略的错误 5
预处理指令中的空白字符 7
#if 指令和注释 7
头文件保护符 9
函数式宏及其运行效率 10
函数式宏的副作用 10
C++ 中max2的实现 12
1-2 初始化 15
初始化和赋值 15
对象 16
自动存储期 16
静态存储期 18
标识符的有效范围和初始化 20
数组的初始化 22
多维数组的初始化 24
使用 typedef名的数组的初始化 26
第 2章 类型转换 29
2-1 类型转换 30
-1和1哪个大? 30
if 语句的求值 31
关系运算符和关系式 31
相等运算符和等式 32
if 语句的控制表达式 35
隐式类型转换 37
普通算术类型转换 38
2-2 有符号整数和无符号整数 39
无符号整数在内存中的表示 39
有符号整数在内存中的表示 41
整型提升 43
有符号整数和无符号整数之间的类型转换 45
问题的解决 47
补码表示的有符号整数到无符号整数的类型转换 48
第 3章 关于指针 53
3-1 指针和地址 54
地址和取址运算符 54
指针和间接运算符 55
3-2 指针和函数调用 58
值传递 58
传递指针给函数 59
传递指针的指针给函数 61
3-3 指针和数组 64
数组的传递 64
表示数组末尾的哨兵 67
指针、数组和数据类型 69
3-4 指针和多维数组 72
数据类型的派生和多维数组 72
多维数组和指针 76
3-5 动态对象的生成 80
动态存储期 80
void 指针 81
单个对象的生成 81
数组对象的生成 83
多维数组对象的生成 85
第 4章 字符串和指针 89
4-1 字符和字符串 90
字符和字符串 90
字符和字符常量 90
字符的值 91
字符串 93
字符串字面量 95
字符串字面量和字符串常量 97
用指针实现的字符串的操作 99
指向字符串的指针 100
字符串数组 101
4-2 字符串的处理 103
字符串的复制 103
字符串不能为空? 106
使字符串为空的两种方法 108
使字符串为空的错误方法 110
问题的解决 111
存储空间的清空 113
字符串的动态生成 115
字符串数组的动态生成 117
第 5章 NULL 119
5-1 空指令、空字符和空语句 120
120
空指令 120
空字符 121
空字符串 121
空语句 122
5-2 空指针和NULL 124
空指针 124
空指针常量 124
返回空指针的函数 124
空指针在内存中的表示不一定为 0 125
第 6章 函数的定义和声明 129
6-1 函数的定义和调用 130
函数定义的顺序 130
调用未声明的函数 131
默认的 int型 132
未声明的函数的处理 133
老式风格的函数声明 135
老式风格的函数声明的陷阱 136
6-2 函数原型声明 137
函数原型声明 137
默认参数提升 138
参数名 142
可变参数的声明 143
va_start 宏:访问可变参数前的准备 145
va_arg 宏:取出可变参数 146
va_end 宏:结束对可变参数的访问 147
vprintf 函数/vfprintf函数:输出到流 147
第 7章 结构体和共用体 151
7-1 结构体 152
结构体的基础 152
成员的访问 153
结构体对象的初始化 153
结构体和宏 154
结构体和 typedef声明 155
相互引用的结构体 157
7-2 结构体与字节对齐 162
代码优化 162
结构体和字节对齐 163
offsetof 宏 165
7-3 共用体 168
共用体 168
共用体对象的初始化 168
公共初始序列 169
第 8章 文件处理和文本文件 173
8-1 文本文件 174
文件和流 174
文件的打开和关闭 175
FILE 型 177
输入输出库函数 178
问题和解决方法 184
解决方法一:添加无效数据 185
解决方法二:优化程序 186
8-2 作为字符的数据 189
数值的读取 189
数值和字符串 190
使用 sprintf 函数将数据写入字符串 196
使用 sscanf 函数从字符串中读取数据 197
第 9章 文件的应用 201
9-1 流和缓冲区 202
调用的函数未被执行? 202
缓冲区的刷新 203
流的缓冲区 205
问题的解决 207
9-2 文本文件和二进制文件 209
文本和二进制 209
文件的转储 210
二进制文件的访问 212
字节序 214
换行符的处理 214
第 10章 栈溢出 217
10-1 栈 218
栈的实现 218
10-2 栈溢出 224
函数调用和栈 224
数据和栈 225
栈溢出 227
检测栈溢出的原理 229
如果栈被破坏 230
第 11章 库开发的基础 231
11-1 源文件的分离和链接 232
单字符输入输出库 232
队列 234
库的使用示例 235
分离式编译 236
链接性 237
11-2 库开发 240
源文件的分离 240
正确的示例 243
第 12章 线性表的应用 249
12-1 线性表 250
线性表 250
节点的实现 250
线性表的特点 251
线性表的实现 252
线性表存储空间的动态分配 256
12-2 用数组实现的线性表 258
用数组实现的线性表 258
删除的记录的管理 261
12-3 带索引的线性表 264
带索引的线性表 264
索引表 270
第 13章 二叉查找树的应用 273
13-1 二叉查找树 274
二叉查找树 274
二叉查找树和线性表 278
13-2 非递归查找及其应用 282
递归的过程 282
递归函数的非递归实现 283
问题的解决 285
第 14章 控制台的操作 291
14-1 转义序列 292
转义序列 292
14-2 画面控制库 296
Windows API 的使用 296
clearscreen 实用程序 299
setcolor 实用程序 299
猜数游戏 301
致 谢 304
作者简介 305