第1章 程序设计基础 1
1.1提前引用的概念 1
1.2第一个C语言程序 1
1.2.1 Hello World 1
1.2.2将C语言程序变成可执行程序 4
1.3基本数据类型 6
1.3.1数据类型 6
1.3.2整型数据 7
1.3.3浮点型数据 10
1.4常量与变量 12
1.4.1常量的类型 12
1.4.2保留字与标识符 14
1.4.3变量的三要素 15
1.4.4变量的类型转换 21
1.4.5只读变量与易变变量 22
1.4.6声明类型的别名(typedef) 24
1.5指针 25
1.5.1变量的地址与指针变量 25
1.5.2指针类变量类型转换 33
1.5.3指向指针变量的指针 34
1.6深入理解C语言的变量 36
1.6.1计算机的存储结构 36
1.6.2变量的存储 37
1.7运算符 40
1.7.1操作数 40
1.7.2分类 40
1.7.3运算符优先级与结合性 41
1.8表达式 42
1.8.1表达式的类型 42
1.8.2表达式的左值与右值 43
1.8.3表达式的副作用 44
1.8.4表达式分类 44
1.8.5表达式的类型转换 48
1.9算术运算符和算术表达式 49
1.9.1算术运算符 49
1.9.2位操作运算符与位操作算术表达式 56
1.10赋值运算符和赋值表达式 62
1.10.1赋值运算符 62
1.10.2赋值过程中的类型转换 63
1.11再论指针 63
1.11.1指针运算符与指针表达式 63
1.11.2只读指针与可变指针 64
1.11.3空指针与未初始化的指针 65
1.11.4 void类型指针 66
1.12数据的输入与输出 67
1.12.1 C语句的分类 67
1.12.2标准输入/输出模型 68
1.12.3格式化输出 71
1.12.4格式化输入 75
1.13字符的输入与输出 79
1.13.1输出一个字符 79
1.13.2输入一个字符 80
第2章 简单函数 82
2.1函数的定义与声明 82
2.1.1函数的定义 82
2.1.2函数的声明 83
2.2函数的调用 84
2.2.1函数的调用形式 84
2.2.2传值调用时的数据传递 85
2.2.3传址调用时的数据传递 89
2.2.4数据传递的深度思考 98
2.3函数的返回值 99
2.3.1函数返回数值 99
2.3.2函数返回地址 101
2.4函数参数与内部实现规则 102
2.4.1参数类型的检查 102
2.4.2用const修饰函数的参数 102
2.4.3函数内部实现的规则 103
2.5栈与函数 103
2.5.1栈的概念 103
2.5.2栈的基本操作 103
2.5.3函数的调用与返回 106
2.6库函数与标准库函数 106
第3章 选择结构程序设计 108
3.1关系运算符与关系表达式 108
3.2用if语句实现选择结构 109
3.2.1 if语句 110
3.2.2 if-else语句及其嵌套 111
3.3逻辑表达式与条件表达式 113
3.3.1逻辑运算符与逻辑表达式 113
3.3.2条件运算符与条件表达式 118
3.4多分支选择结构 120
3.4.1 switch语句详解 120
3.4.2 break语句 122
3.4.3 switch语句嵌套 123
3.4.4使用建议 124
第4章 循环结构程序设计 125
4.1 while与do-while循环 125
4.1.1循环控制的需要 125
4.1.2用while语句实现循环 126
4.1.3用do-while实现循环 133
4.1.4 while和do-while循环中的break与continue 136
4.2 for循环 139
4.2.1用for语句实现循环 139
4.2.2 for循环中的break与continue 143
4.2.3 for与while的区别 147
4.3循环语句的嵌套 147
4.3.1与分支语句嵌套 147
4.3.2多重循环 148
第5章 深入理解指针 150
5.1一维数组与指针 150
5.1.1数组类型的建立 150
5.1.2一维数组变量的定义与初始化 151
5.1.3数组变量元素的访问 152
5.1.4指针的算术运算 161
5.1.5用数组变量名作为函数参数 163
5.1.6指向数组变量的指针 170
5.2字符数组与指针 171
5.2.1字符串与字符数组 171
5.2.2指向字符串的指针及字符串的运算 174
5.2.3聚焦字符串——存值与存址 179
5.2.4字符串的输入与输出 181
5.2.5常用字符串处理函数 184
5.2.6任意精度算术 189
5.3结构体与指针 197
5.3.1结构体类型的建立 197
5.3.2结构体类型变量的定义 198
5.3.3结构体变量的初始化与引用 202
5.3.4指向结构体变量的指针 205
5.3.5构造类型成员与指针类型成员 208
5.4结构体数组与指针 209
5.4.1结构体数组的定义 209
5.4.2结构体数组变量的初始化与引用 211
5.4.3指向结构体数组元素的指针 216
5.5枚举与指针 217
5.5.1枚举与int 217
5.5.2枚举类型的定义 217
5.5.3枚举变量的定义 218
5.5.4枚举变量的使用与初始化 219
5.5.5指向枚举变量的指针 221
5.5.6枚举数组与指针 221
第6章 变量与函数 222
6.1声明与定义 222
6.2作用域与可见性 222
6.2.1作用域 222
6.2.2可见性 223
6.3变量的作用域与可见性 223
6.3.1全局变量 223
6.3.2局部变量 226
6.3.3变量可见范围的覆盖 227
6.4变量的存储方式与生存期 230
6.4.1动态存储方式与静态存储方式 230
6.4.2存储方式与生存期的关系 230
6.5函数的作用域与可见性 232
6.5.1内部函数 232
6.5.2外部函数 233
第7章 深入理解函数 234
7.1函数指针 234
7.1.1函数指针变量的定义与初始化 234
7.1.2通过函数指针调用函数 236
7.1.3用函数指针作为函数的返回值 241
7.2软件分层技术 244
7.2.1分层设计原则 244
7.2.2带有回调的双向数据传递 245
7.2.3注册回调机制 250
7.3函数的嵌套调用与递归调用 257
7.3.1函数的嵌套调用与堆栈 257
7.3.2函数的递归调用与堆栈 259
第8章 深入理解数组与指针 264
8.1复杂指针 264
8.1.1指向指针变量的指针与多重指针 264
8.1.2指针类型数组 267
8.1.3数组类型指针 273
8.1.4与结构体相关的复杂指针 275
8.2多维数组和指针 276
8.2.1二维数组变量的定义 276
8.2.2二维数组变量的初始化 277
8.2.3二维数组变量的类型 277
8.2.4二维数组变量元素的访问 278
8.3用复杂指针作为函数参数 279
8.3.1用指针数组(双重指针)作为函数参数 279
8.3.2用二维数组(数组指针)作为函数参数 280
8.4函数指针数组 282
8.4.1函数指针数组的定义与初始化 282
8.4.2函数指针数组的引用 282
第9章 深入理解结构与指针 284
9.1复杂结构体类型成员 284
9.1.1用另一个结构体作为结构体的成员 284
9.1.2用指向结构体的指针作为结构体的成员 285
9.1.3用函数指针作为结构体类型的成员 287
9.2动态存储分配 289
9.2.1申请存储空间 290
9.2.2释放存储空间 290
9.2.3重新分配存储空间 290
9.2.4内存泄漏 291
9.3使用结构与指针处理链表 292
9.3.1线性表 292
9.3.2链表 293
9.3.3单向链表 294
第10章 流与文件 309
10.1概述 309
10.1.1外设与文件 309
10.1.2流的概念 310
10.1.3流与文件的关系 310
10.1.4文本流与二进制流 310
10.1.5流与缓冲 311
10.1.6标准输入/输出 311
10.1.7文件操作概述 312
10.2文件的基本操作 312
10.2.1打开/关闭文件 312
10.2.2读流与写流 314
10.2.3判断文件结束 315
10.2.4文件定位 315
10.2.5复制文件示例 316
10.3格式化输入/输出 318
10.3.1格式化输出 318
10.3.2格式化输入 319
10.4字符输入/输出 320
10.4.1字符输入/输出标准库函数 320
10.4.2将输入的字符退回到流中 321
10.4.3占用较小RAM空间的文件复制示例 322
10.5字符串输入/输出 323
10.5.1字符串输入/输出标准库函数 323
10.5.2文本复制示例 324
10.6其他外部环境接口函数 325
10.6.1流与缓冲 326
10.6.2标准出错设备 327
10.6.3其他函数 327
第11章 创建可重用软件模块的技术 328
11.1软件危机与开发方法 328
11.1.1概述 328
11.1.2软件危机 329
11.1.3软件开发方法 329
11.1.4设计模式 330
11.1.5测试驱动开发 331
11.2接口与实现 332
11.2.1基本概念 333
11.2.2结构程序设计 334
11.2.3编写自己的头文件 337
11.3栈 339
11.3.1栈的逻辑结构与存储结构 339
11.3.2抽象数据类型 341
11.3.3栈抽象 342
11.4队列 351
11.4.1队列的逻辑结构与存储结构 351
11.4.2队列抽象 353
11.4.3事件驱动程序设计 359
11.5通用双向链表 362
11.5.1双向链表 362
11.5.2通用双向链表库 364
11.5.3接口功能的实现 367
11.5.4用单向链表实现ILink.h接口 374
11.5.5链栈 375
11.5.6链队列 377
11.6带迭代器的双向链表 379
11.6.1容器、算法与迭代器 379
11.6.2双向链表的迭代器接口 382
11.6.3基于迭代器的算法接口 383
11.6.4遍历算法与搜索算法 385
11.6.5容器、算法和迭代器的使用 386
参考文献 389