第1章 概览 1
14.8.6 在结构中使用字符数组还是字符指针 41 1
目录 1
1.2 使用C语言的理由 2
1.1 C语言的起源 2
1.2.6 缺点 3
1.2.1 设计特性 3
1.2.2 高效性 3
1.2.3 可移植性 3
1.2.4 强大的功能和灵活性 3
1.2.5 面向编程人员 3
1.3 C语言的发展方向 4
1.5 高级计算机语言和编译器 5
1.4 计算机工作的基本原理 5
1.6.1 第1步:定义程序目标 6
1.6 使用C语言的7个步骤 6
1.6.5 第5步:运行程序 7
1.6.2 第2步:设计程序 7
1.6.3 第3步:编写代码 7
1.6.4 第4步:编译 7
1.7 编程机制 8
1.6.6 第6步:测试和调试程序 8
1.6.7 第7步:维护和修改程序 8
1.6.8 注释 8
1.7.1 目标代码文件、可执行文件和库 9
1.7.2 UNIX系统 10
1.7.3 Linux系统 11
1.7.5 IBM PC的DOS编译器 12
1.7.4 集成开发环境(Windows系统下) 12
1.8.1 第1个ANSI/ISO C标准 13
1.7.6 Macintosh上的C 13
1.8 语言标准 13
1.10 本书体例 14
1.8.2 C99标准 14
1.9 本书的组织结构 14
1.10.2 屏幕输出 15
1.10.1 字体 15
1.13 编程练习 16
1.11 总结 16
1.12 复习题 16
第2章 C语言概述 17
2.2.1 第一遍 快速简介 18
2.1 C语言的一个简单实例 18
2.2 解释 18
2.2.2 第二遍 细节 20
2.3 一个简单程序的结构 25
2.4 使程序可读的技巧 26
2.5.2 多个声明 27
2.5 更进一步 27
2.5.1 说明 27
2.6 多个函数 28
2.5.3 乘法 28
2.5.4 输出多个值 28
2.7 调试 29
2.7.2 语义错误 30
2.7.1 语法错误 30
2.7.3 程序状态 31
2.9 关键概念 32
2.8 关键字和保留标识符 32
2.11 复习题 33
2.10 总结 33
2.12 编程练习 34
第3章 数据和C 36
3.1 示例程序 37
3.2 变量与常量数据 38
3.3 数据:数据类型关键字 39
3.3.3 浮点数 40
3.3.1 整数类型与浮点数类型 40
3.3.2 整数 40
3.4.1 int类型 41
3.4 C数据类型 41
3.4.2 其他整数类型 43
3.4.3 使用字符:char类型 47
3.4.5 可移植的类型:inttypes.h 51
3.4.4 _Bool类型 51
3.4.6 float、double和long double类型 52
3.4.8 其他类型 55
3.4.7 复数和虚数类型 55
3.4.9 类型大小 57
3.6 参数和易犯的错误 58
3.5 使用数据类型 58
3.7 另一个例子 59
3.7.2 刷新输出 60
3.7.1 过程分析 60
3.10 复习题 61
3.8 关键概念 61
3.9 总结 61
3.11 编程练习 63
第4章 字符串和格式化输入/输出 64
4.1 前导程序 65
4.2.1 char数组类型和空字符 66
4.2 字符串简介 66
4.2.3 strlen()函数 67
4.2.2 使用字符串 67
4.3 常量和C预处理器 69
4.3.2 系统定义的明显常量 71
4.3.1 const修饰符 71
4.4.1 printf()函数 73
4.4 研究和利用printf()和scanf() 73
4.4.2 使用printf() 74
4.4.3 printf()的转换说明修饰符 75
4.4.4 转换的意义 79
4.4.5 使用scanf() 84
4.4.6 printf()和scanf()的*修饰符 87
4.5 用法提示 88
4.7 总结 89
4.6 关键概念 89
4.8 复习题 90
4.9 编程练习 91
第5章 运算符、表达式和语句 93
5.1 循环简介 94
5.2.1 赋值运算符:= 95
5.2 基本运算符 95
5.2.5 乘法运算符:* 97
5.2.2 加法运算符:+ 97
5.2.3 减法运算符:- 97
5.2.4 符号运算符:-和+ 97
5.2.6 除法运算符: 99
5.2.7 运算符的优先级 100
5.2.8 优先级和求值顺序 101
5.3.2 取模运算符:% 103
5.3 其他运算符 103
5.3.1 sizeof运算符和size t类型 103
5.3.3 增量和减量运算符:++和-- 104
5.3.4 减量:-- 107
5.3.6 不要太聪明 108
5.3.5 优先级 108
5.4.1 表达式 109
5.4 表达式和语句 109
5.4.2 语句 110
5.4.3 复合语句(代码块) 112
5.5 类型转换 113
5.6 带有参数的函数 115
5.7 一个示例程序 117
5.9 总结 118
5.8 关键概念 118
5.10 复习题 119
5.11 编程练习 121
第6章 C控制语句:循环 123
6.1 最初的例子 124
6.1.1 程序注解 125
6.2 while语句 126
6.1.2 C风格的读循环 126
6.2.3 while:入口条件循环 127
6.2.1 终止while循环 127
6.2.2 循环何时终止 127
6.2.4 语法要点 128
6.3 比较大小:使用关系运算符和表达式 129
6.3.1 什么是真 130
6.3.2 还有什么是真 131
6.3.3 真值的问题 132
6.3.4 新的Bool类型 133
6.3.5 关系运算符的优先级 134
6.5 for循环 136
6.4 不确定循环与计数循环 136
6.7 逗号运算符 141
6.6 更多赋值运算符:+=、-=、*=、/=和%= 141
6.8 退出条件循环:do while 145
6.10 嵌套循环 147
6.9 选择哪种循环 147
6.10.2 嵌套变化 148
6.10.1 程序讨论 148
6.11 数组 149
6.12 使用函数返回值的循环例子 151
6.12.1 程序讨论 153
6.14 总结 154
6.12.2 使用具有返回值的函数 154
6.13 关键概念 154
6.15 复习题 155
6.16 编程练习 159
第7章 C控制语句:分支和跳转 161
7.1 if语句 162
7.2 在if语句中添加else关键字 163
7.2.1 另一个例子:介绍getchar()和putchar() 165
7.2.2 ctype.h系列字符函数 166
7.2.3 多重选择else if 168
7.2.4 把else与if配对 170
7.2.5 多层嵌套的if 171
7.3 获得逻辑性 174
7.3.2 优先级 175
7.3.1 改变拼写法:iso646.h头文件 175
7.3.3 求值的顺序 176
7.4 一个统计字数的程序 177
7.3.4 范围 177
7.5 条件运算符?: 180
7.6 循环辅助手段:continue和break 181
7.6.1 continue语句 182
7.6.2 break语句 184
7.7 多重选择:switch和break 185
7.7.1 使用switch语句 186
7.7.3 多重标签 188
7.7.2 只读取一行的首字符 188
7.8 goto语句 190
7.7.4 switch和if else 190
7.10 总结 193
7.9 关键概念 193
7.11 复习题 194
7.12 编程练习 196
第8章 字符输入/输出和输入确认 199
8.1 单字符I/O:getchar()和putchar() 200
8.2 缓冲区 201
8.3.1 文件、流和键盘输入 202
8.3 终止键盘输入 202
8.3.2 文件结尾 203
8.4 重定向和文件 204
8.5.1 使用缓冲输入 208
8.5 创建一个更友好的用户界面 208
8.5.2 混合输入数字和字符 210
8.6 输入确认 212
8.6.1 分析程序 215
8.7 菜单浏览 216
8.6.2 输入流和数值 216
8.7.2 使执行更顺利 217
8.7.1 任务 217
8.7.3 混合字符和数值输入 219
8.9 总结 221
8.8 关键概念 221
8.11 编程练习 222
8.10 复习题 222
第9章 函数 224
9.1.1 编写和使用一个简单的函数 225
9.1 函数概述 225
9.1.2 程序分析 226
9.1.3 函数参数 228
9.1.4 定义带有参数的函数:形式参量 229
9.1.6 调用带有参数的函数:实际参数 230
9.1.5 带参数函数的原型声明 230
9.1.8 使用return从函数中返回一个值 231
9.1.7 黑盒子观点 231
9.2 ANSIC的函数原型 234
9.1.9 函数类型 234
9.2.1 产生的问题 235
9.2.2 ANSI的解决方案 236
9.3 递归 237
9.2.3 无参数和不确定参数 237
9.2.4 函数原型的优点 237
9.3.2 递归的基本原理 238
9.3.1 递归的使用 238
9.3.3 尾递归 239
9.3.4 递归和反向计算 241
9.3.5 递归的优缺点 242
9.5.2 Linux 243
9.4 所有C函数地位同等 243
9.5 多源代码文件程序的编译 243
9.5.1 UNIX 243
9.5.5 头文件的使用 244
9.5.3 DOS命令行编译器 244
9.5.4 Windows和Macintosh编译器 244
9.6 地址运算符:& 247
9.7 改变调用函数中的变量 248
9.8 指针简介 249
9.8.2 指针声明 250
9.8.1 间接运算符:* 250
9.8.3 使用指针在函数间通信 251
9.9 关键概念 254
9.11 复习题 255
9.10 总结 255
9.12 编程练习 256
第10章 数组和指针 257
10.1.1 初始化 258
10.1 数组 258
10.1.2 指定初始化项目(C99) 261
10.1.4 数组边界 262
10.1.3 为数组赋值 262
10.2 多维数组 264
10.1.5 指定数组大小 264
10.2.1 初始化二维数组 266
10.2.2 更多维数的数组 267
10.3 指针和数组 268
10.4 函数、数组和指针 270
10.4.1 使用指针参数 272
10.5 指针操作 274
10.4.2 评论:指针和数组 274
10.6 保护数组内容 276
10.6.1 对形式参量使用const 277
10.6.2 有关const的其他内容 278
10.7 指针和多维数组 280
10.7.1 指向多维数组的指针 282
10.7.2 指针兼容性 283
10.7.3 函数和多维数组 284
10.8 变长数组(VLA) 286
10.9 复合文字 289
10.11 总结 291
10.10 关键概念 291
10.12 复习题 292
10.13 编程练习 294
第11章 字符串和字符串函数 296
11.1 在程序中定义字符串 298
11.2 字符串数组及其初始化 299
11.2.1 数组与指针 300
11.2.2 字符串数组 301
11.2.3 指针和字符串 302
11.3.1 创建存储空间 303
11.3 字符串输入 303
11.3.2 gets()函数 304
11.3.3 fgets()函数 305
11.3.4 scanf()函数 306
11.4.1 puts()函数 307
11.4 字符串输出 307
11.4.2 fputs()函数 308
11.5 自定义字符串输入/输出函数 309
11.4.3 printf()函数 309
11.6.1 strlen()函数 311
11.6 字符串函数 311
11.6.2 strcat()和 strncat()函数 312
11.6.3 strcmp()和strncmp()函数 314
11.6.4 strcpy()和strncpy()函数 317
11.6.5 sprintf()函数 320
11.6.6 其他字符串函数 321
11.7 字符串例子:字符串排序 323
11.8 ctype.h字符函数和字符串 325
11.9 命令行参数 326
11.9.2 Macintosh的命令行参数 328
11.9.1 集成环境下的命令行参数 328
11.10 把字符串转换为数字 329
11.13 复习题 331
11.11 关键概念 331
11.12 总结 331
11.14 编程练习 334
第12章 存储类、链接和内存管理 336
12.1.1 作用域 337
12.1 存储类 337
12.1.2 链接 338
12.1.4 自动变量 339
12.1.3 存储时期 339
12.1.6 具有代码块作用域的静态变量 342
12.1.5 寄存器变量 342
12.1.7 具有外部链接的静态变量 343
12.1.10 存储类说明符 347
12.1.8 具有内部链接的静态变量 347
12.1.9 多文件 347
12.1.11 存储类和函数 349
12.2 随机数函数和静态变量 350
12.1.12 使用哪种存储类 350
12.3 掷骰子 353
12.3.1 分配内存:malloc()和free() 356
12.3.2 free()的重要性 358
12.3.4 动态内存分配与变长数组 359
12.3.3 函数calloc() 359
12.4.1 类型限定词const 360
12.3.5 存储类与动态内存分配 360
12.4 ANSI C的类型限定词 360
12.4.3 类型限定词restrict 362
12.4.2 类型限定词volatile 362
12.5 旧关键字的新位置 363
12.7 总结 364
12.6 关键概念 364
12.8 复习题 365
12.9 编程练习 366
第13章 文件输入/输出 369
13.1.1 文件是什么 370
13.1 和文件进行通信 370
13.2 标准I/O 371
13.1.2 I/O级别 371
13.1.3 标准文件 371
13.2.1 检查命令行参数 372
13.2.2 fopen()函数 373
13.2.4 文件结尾 374
13.2.3 getc()函数和putc()函数 374
13.3 一个简单的文件压缩程序 375
13.2.5 fclose()函数 375
13.2.6 标准文件 375
13.4.1 fprintf()和fscanf()函数 377
13.4 文件I/O:fprintf( )、fscanf( )、fgets( )和fputs( )函数 377
13.4.2 fgets()和fputs()函数 378
13.5 随机存取:fseek()和ftell()函数 379
13.5.1 fseek()和 ftell()如何工作 380
13.5.2 二进制模式和文本模式 381
13.6 标准I/O 内幕 382
13.5.3 可移植性 382
13.5.4 fgetpos()和 fsetpos()函数 382
13.7.1 int ungetc(int c,FILE*fp)函数 383
13.7 其他标准I/O函数 383
13.7.4 二进制I/O:fread()和 fwrite()函数 384
13.7.2 int fflush(FILE*fp)函数 384
13.7.3 int setvbuf(FILE*fp,char*buf,int mode,size_t size)函数 384
13.7.5 size_t fwrite(void*ptr,size_t size,size_t nmemb,FILE*fp)函数 385
13.7.8 一个例子 386
13.7.6 size_t fread(void*ptr,size_t size,size_t nmemb,FILE*fp)函数 386
13.7.7 int feof(FILE*fp)和int ferror(FILE*fp)函数 386
13.7.9 使用二进制I/O进行随机存取 388
13.8 关键概念 389
13.10 复习题 390
13.9 总结 390
13.11 编程练习 392
第14章 结构和其他数据形式 394
14.1 示例问题:创建书籍目录 395
14.3 定义结构变量 396
14.2 建立结构声明 396
14.3.1 初始化结构 397
14.4 访问结构成员 398
14.3.2 结构的指定初始化项目 398
14.5 结构数组 399
14.5.1 声明结构数组 400
14.5.3 程序讨论 401
14.5.2 标识结构数组的成员 401
14.6 嵌套结构 402
14.7 指向结构的指针 403
14.7.1 声明和初始化结构指针 404
14.8 向函数传递结构信息 405
14.7.2 使用指针访问成员 405
14.8.2 使用结构地址 406
14.8.1 传递结构成员 406
14.8.3 把结构作为参数传递 407
14.8.4 其他结构特性 408
14.8.5 结构,还是指向结构的指针 410
14.8.7 结构、指针和malloc() 412
14.8.8 复合文字和结构(C99) 414
14.8.9 伸缩型数组成员(C99) 415
14.8.10 使用结构数组的函数 416
14.9 把结构内容保存到文件中 418
14.11 联合简介 421
14.10 结构:下一步是什么 421
14.12.2 默认值 424
14.12.1 enum常量 424
14.12 枚举类型 424
14.12.4 用法 425
14.12.3 指定值 425
14.13 typedef简介 426
14.12.5 共享的名字空间 426
14.14 奇特的声明 428
14.15 函数和指针 429
14.16 关键概念 434
14.18 复习题 435
14.17 总结 435
14.19 编程练习 437
第15章 位操作 440
15.1.1 二进制整数 441
15.1 二进制数、位和字节 441
15.1.3 二进制浮点数 442
15.1.2 有符号整数 442
15.2.2 十六进制 443
15.2.1 十进制 443
15.2 其他基数 443
15.3.1 位逻辑运算符 444
15.3 C的位运算符 444
15.3.2 用法:掩码 445
15.3.4 用法:关闭位 446
15.3.3 用法:打开位 446
15.3.7 移位运算符 447
15.3.6 用法:查看一位的值 447
15.3.5 用法:转置位 447
15.3.8 编程实例 448
15.3.9 另一个实例 449
15.4 位字段 451
15.4.1 位字段实例 452
15.4.2 位字段和位运算符 454
15.5 关键概念 458
15.7 复习题 459
15.6 总结 459
15.8 编程练习 460
第16章 C预处理器和C库 462
16.2 明显常量:#define 463
16.1 第一步 463
16.2.2 重定义常量 466
16.2.1 语言符号 466
16.3 在#define中使用参数 467
16.3.2 预处理器的粘合剂:##运算符 469
16.3.1 利用宏参数创建字符串:#运算符 469
16.3.3 可变宏:...和____VA_ARGS____ 470
16.4 宏,还是函数 471
16.5 文件包含:#include 472
16.5.1 头文件:一个实例 473
16.5.2 使用头文件 474
16.6.2 已定义:C预处理器的观点 475
16.6.1 #undef指令 475
16.6 其他指令 475
16.6.3 条件编译 476
16.6.4 预定义宏 479
16.6.5 #line和#error 480
16.7 内联函数 481
16.6.6 #pragma 481
16.8.1 访问C库 483
16.8 C库 483
16.8.2 参考库描述 484
16.9 数学库 485
16.10.1 exit()和atexit()函数 487
16.10 通用工具库 487
16.10.2 qsort()函数 488
16.11 诊断库 492
16.12 string.h库中的memcpy()和memmove() 493
16.13 可变参数:stdarg.h 494
16.16 复习题 496
16.15 总结 496
16.14 关键概念 496
16.17 编程练习 497
第17章 高级数据表示 500
17.1 研究数据表示 501
17.2 从数组到链表 503
17.2.1 使用链表 506
17.2.2 反思 508
17.3 抽象数据类型(ADT) 509
17.3.2 构造接口 510
17.3.1 变得抽象 510
17.3.3 使用接口 513
17.3.4 实现接口 514
17.4 队列ADT 520
17.4.1 实现接口的数据表示 521
17.4.2 测试队列 528
17.5 用队列进行模拟 529
17.6 链表与数组 534
17.7 二叉搜索树 537
17.7.1 二叉树ADT 537
17.7.2 二叉搜索树的接口 538
17.7.3 二叉树的实现 540
17.7.4 试用树 551
17.7.5 树的思想 555
17.8 其他说明 556
17.10 总结 557
17.11 复习题 557
17.12 编程练习 557
17.9 关键概念 557
附录A 复习题答案 559
附录B 参考资料 590