第1章 邂逅程序设计——初识C语言 1
1.1 第一个程序——我会算加法 2
1.2 人机交互——输入和输出函数的基本用法 10
1.3 条件与判断——随机应变 17
1.3.1 二叉分支的表达——基本的if-else语句 17
1.3.2 复合条件的表达 22
1.4 利用库函数——拿来主义 25
1.5 机器擅长之“算术运算”——计算机的老本行 28
1.6 变量——数据的栖身之所 34
1.6.1 变量的概念 34
1.6.2 变量的数据类型 37
1.6.3 程序中的常量 40
1.7 赋值运算——改变变量的值 42
1.8 程序设计的一般过程 47
本章小结 48
第2章 程序逻辑之关键——分支与循环 51
2.1 机器智能与决策之基石——分支结构 52
2.1.1 决策与分支结构 52
2.1.2 基本分支结构及其连接方式 60
2.1.3 逻辑运算与复合条件表达 71
2.1.4 if条件表达典型错误分析 75
2.2 机器擅长之“循环”——不厌其烦地重复 77
2.2.1 for循环的引入 78
2.2.2 剖析for循环 86
2.2.3 必须应用循环结构的场合 90
2.2.4 循环的初步运用 93
2.2.5 for循环常见错误分析 96
2.3 程序逻辑进阶——多分支和多重循环 98
2.3.1 深入理解循环 98
2.3.2 循环的连接 100
2.3.3 双重循环与多重循环 107
2.3.4 break和continue的运用 110
2.3.5 分支与循环的串联和嵌套 120
2.4 其他形式分支与循环 121
2.4.1 switch-case分支结构 121
2.4.2 while与do...while循环 128
本章小结 130
第3章 批量数据存储与处理——数组 134
3.1 何时需要数组 134
3.2 序列数据的处理——一维数组 135
3.2.1 一维数组的定义 135
3.2.2 数组与内存分配 137
3.2.3 数组操作之演练 140
3.2.4 一维数组的运用 141
3.2.5 巧用数组下标 149
3.3 表格型数据的处理——二维数组 154
3.3.1 二维数组的定义 154
3.3.2 访问二维数组的元素 155
3.3.3 二维数组操作演练 155
3.3.4 二维数组的应用 159
3.4 其他 164
3.4.1 数组的拓展——多维数组 164
3.4.2 二维数组与一维数组的关系 165
3.4.3 数组下标越界 165
3.4.4 数组定义时的大小能否为变量 167
本章小结 168
第4章 文本数据处理——字符串 169
4.1 字符数据存储和处理 169
4.1.1 字符的编码 169
4.1.2 字符数据的存储 173
4.1.3 字符数据的运算 173
4.2 字符串数据存储和处理 176
4.2.1 字符串的存储 176
4.2.2 文本型数据输入/输出 177
4.2.3 字符串处理与库函数 180
4.3 文本型数据处理之演练 190
4.4 其他 193
4.4.1 空字符‘\0’的作用 193
4.4.2 字符和字符串的区别与联系 194
本章小结 195
第5章 模块化设计之利器——函数 196
5.1 初识函数设计 197
5.2 函数的概念 200
5.2.1 函数的概念剖析 200
5.2.2 模块化设计思想在函数中的体现 203
5.3 新函数是如何炼成的 206
5.4 函数的设计 207
5.4.1 发掘任务中的模块 207
5.4.2 函数的定义 207
5.4.3 设计函数的方法论 209
5.4.4 设计函数的要点详解 211
5.5 函数的测试 220
5.6 函数的交付使用 221
5.6.1 函数的调用形式 223
5.6.2 函数调用过程详解 224
5.6.3 函数参数的传递 230
5.6.4 函数的声明 234
5.7 函数设计实践 236
5.8 函数的递归——自相似之美 249
5.8.1 初识递归函数 250
5.8.2 递归函数设计的关键点 253
5.8.3 递归调用的执行过程 262
5.8.4 二分法与递归 264
5.8.5 递归与非递归 273
5.8.6 提高递归效率 281
5.9 函数相关主题 287
5.9.1 局部变量与全局变量 287
5.9.2 函数的嵌套定义的应用 289
5.9.3 如何生成随机数 289
5.9.4 库函数 295
5.9.5 初谈提高程序效率 295
本章小结 299
第6章 内存间接访问之神器——指针 301
6.1 深入理解内存地址 302
6.1.1 内存是什么 302
6.1.2 什么是内存地址 302
6.2 间接访问与直接访问 305
6.3 指针变量与普通变量 309
6.3.1 指针变量的概念 309
6.3.2 揭秘“指针”的由来 310
6.3.3 普通变量与指针变量的对比 311
6.4 指针与数组的天然联系 312
6.4.1 数组名与数组起始地址 312
6.4.2 揭秘访问数组的更多细节 313
6.5 指针的移动 319
6.6 地址值在函数调用中的特殊作用 331
6.6.1 函数调用过程详解 331
6.6.2 指针作为函数参数 334
6.6.3 数组名作为函数实参 341
6.6.4 可接受地址值的形参类型探究 349
6.7 指针与动态内存分配 352
6.7.1 一维数组的动态内存分配 354
6.7.2 二维及多维数组与指针 357
6.7.3 多阶指针 370
6.7.4 返回值为指向动态分配空间的指针 370
6.8 变量的存储区、作用范围与生命期 371
6.8.1 静态变量和全局变量 372
6.8.2 进程内存地址空间布局 376
6.8.3 变量的作用范围、生命期和存储区 379
6.8.4 extern的用法 382
6.9 函数也可作为参数——函数指针与应用 384
6.9.1 函数指针的概念 384
6.9.2 函数指针数组的运用 387
6.9.3 函数指针与qsort()函数的应用 388
本章小结 396
第7章 创造新数据类型——结构体类型 399
7.1 为何引入结构体类型 399
7.2 结构体类型的定义和基本用法 402
7.2.1 结构体类型的定义 402
7.2.2 结构体类型的基本用法 406
7.3 结构体类型数组的用法 409
7.4 结构体类型在函数中的运用 411
7.4.1 结构体类型在函数中的一般用法 411
7.4.2 结构体类型数组的排序 420
7.5 结构体类型与链表 431
7.5.1 链表的概念和用途 431
7.5.2 链表 432
7.5.3 为什么需要链表 439
7.5.4 循环单链表及其应用 440
本章小结 447
第8章 数据持久化——文件 448
8.1 文件的基本概念 449
8.1.1 文件的“纸带模型” 449
8.1.2 缓冲文件读/写过程模型 451
8.1.3 读/写文件基本流程与文件指针 452
8.1.4 文件打开方式 454
8.2 文件的读/写 454
8.2.1 文本文件的读/写 454
8.2.2 二进制文件读/写 459
8.3 文件读/写位置的定位 466
8.4 文本文件与二进制文件的对比 470
8.5 其他主题 475
8.5.1 关于stdin、 stdout、 stderr 475
8.5.2 标准输入、输出的重定向 476
8.5.3 理解和运用stderr与stdout 478
8.5.4 fflush()函数的用法 479
8.5.5 EOF的运用 481
8.5.6 容易被误解的feof()函数 482
8.5.7 fgets()与gets()的区别 484
本章小结 485
第9章 深入到bit的运算——位运算 487
9.1 位运算的运算符 487
9.2 初识位运算 488
9.3 位运算的应用 489
9.4 位运算的注意事项 505
9.4.1 右移的补位方式 505
9.4.2 移位量的取模特性 506
9.4.3 可进行位运算的数据类型 507
9.5 位域 509
本章小结 510