第1章 基础知识 1
1.1 计算机语言概述 1
1.1.1机器语言——面向机器的语言 1
1.1.2汇编语言——面向机器的语言 1
1.1.3高级语言——面向过程、面向对象的语言 2
1.2 C语言的起源 2
1.3为什么要学习C语言 4
1.4集成开发环境 5
第2章 一个最简短的C程序 6
2.1程序示例 6
2.2注释 7
2.3 语句 9
2.4块 9
2.5表达式 9
2.6表达式语句 10
2.7总结 11
第3章 运算符 12
3.1常用运算符 12
3.1.1数学运算符 12
3.1.2赋值运算符 13
3.1.3复合赋值运算符 13
3.1.4自加、自减运算符 15
3.1.5前置的自加、自减运算 15
3.1.6后置的自加、自减运算 16
3.2总结 16
第4章 初识函数 17
4.1 自定义函数 17
4.2带参数的函数 18
4.3函数的返回值 19
4.4形式参数与实际参数 20
4.5形参与实参的类型必须一致 21
4.6局部变量 22
4.7全局变量 23
4.8全局变量的缺点 25
4.9作用域 26
4.10输出函数 27
4.11输入函数 29
4.12字符输出函数 31
4.13字符输入函数 31
4.14函数的声明与定义 33
4.15总结 34
5.1 C语言为什么要有数据类型 35
第5章 数据类型 35
5.2变量的通用原则 35
5.2.1变量的声明 35
5.2.2变量的命名 36
5.2.3变量的定义 37
5.2.4变量的赋值与初始化 38
5.2.5初始化的用途 38
5.2.6变量在内存中的排列 39
5.3整型变量 39
5.3.1整型变量的取值范围 40
5.3.2超出取值范围的后果 40
5.3.3 long与int的区别 41
5.3.4输出短整型变量的值 42
5.3.5输出整型变量的值 42
5.3.6输出长整型变量的值 43
5.3.7输出双长整型变量的值 44
5.3.8输出八进制数和十六进制数 45
5.3.9为类型设置别名 46
5.4浮点型变量 47
5.4.1 float型变量的取值范围 48
5.4.2 double型变量的取值范围 49
5.4.3 long double型变量的取值范围 50
5.4.4浮点型变量的精度 51
5.4.5超出精度的误差 51
5.4.6输出浮点型变量的值 53
5.4.7输入数值到浮点型变量 54
5.5字符型变量 54
5.5.1字符型变量与ASCII码 55
5.5.2字符型变量的赋值 56
5.5.3字符型变量只能保存单个字符 57
5.5.4输出所有的可见字符 57
5.5.5数字与数字字符 58
5.5.6显式转换与隐式转换 58
5.5.7类型提升 59
5.5.8类型下降 60
5.5.9特殊字符 60
5.6 _Bool型变量 62
5.7常量 63
5.7.1宏 63
5.7.2 const常量 65
5.7.3 const常量与宏的区别 65
5.7.4枚举型常量 65
5.8总结 66
第6章 条件选择语句 67
6.1关系运算符 67
6.2 if语句 68
6.2.1 else语句 70
6.2.2 else if语句 70
6.2.3 if语句的嵌套 72
6.2.4 if与else的配对 73
6.2.5复杂的嵌套 75
6.3逻辑运算符 76
6.3.1 逻辑与 77
6.3.2 逻辑或 77
6.3.3 逻辑非 78
6.3.4括号改变优先级 79
6.3.5真与假 80
6.4三目运算符 81
6.4.1三目运算符的优先级 82
6.4.2灵活运用三目运算符 82
6.4.3三目运算符的操作数类型 83
6.4.4三目运算符最常见的用法 83
6.5 switch语句 84
6.5.1 switch语句的用法 84
6.5.2 去掉break的switch语句 85
6.6 总结 86
第7章 循环语句 87
7.1 循环语句的前身——goto语句 87
7.2 慎用goto语句 88
7.3 while语句 88
7.3.1带逻辑运算符的while语句 89
7.3.2限定while循环的次数 90
7.3.3 continue语句 91
7.3.4 break语句 92
7.3.5 exit函数 92
7.3.6猜数字 93
7.3.7永不休止的while循环 95
7.4 do...while循环 96
7.5 for循环 97
7.5.1 for循环的执行过程 98
7.5.2 for循环的注意细则 99
7.5.3域 99
7.5.4灵活的for循环 100
7.5.5条件为空的for循环 100
7.5.6导航菜单 102
7.5.7执行为空的for循环 103
7.5.8嵌套的for循环 104
7.5.9九九乘法表 105
7.6总结 106
第8章 综合实例——博弈机 107
8.1模块1——游戏规则 108
8.2模块2——确定选择方式与支出积分 108
8.3模块3——掷出骰子 109
8.4模块4——判断点数的大小 110
8.5模块5——计算输赢的积分数 111
8.6模块6——检查积分够不够 113
8.7程序的入口——主函数 114
8.8完整程序 116
8.9总结 123
第9章 初识指针 124
9.1什么是地址 124
9.2什么是指针 124
9.3通过指针进行读取 125
9.4通过指针进行修改 126
9.5空指针 127
9.6变更指针保存的地址 128
9.7指针自身的地址 128
9.8指针运算 129
9.8.1指针的加减运算 129
9.8.2指针的赋值运算 130
9.8.3指针的相减运算 131
9.8.4指针的比较运算 131
9.9指针的类型 132
9.10 const与指针 133
9.10.1常量指针 133
9.10.2指向常量的指针 134
9.10.3指向常量的常指针 134
9.11总结 135
第10章 堆和栈 136
10.1内存中的数据 136
10.2什么是堆和栈 138
10.2.1栈 138
10.2.2堆 138
10.2.3堆和栈的应用 138
10.3堆与指针 139
10.3.1利用指针访问堆 139
10.3.2释放指针指向的堆空间 140
10.3.3关于free函数的注意事项 141
10.3.4 内存泄露 142
10.3.5迷途指针 143
10.4总结 144
第11章 数组 145
11.1数组的用法 145
11.1.1数组的定义 145
11.1.2数组的元素 145
11.1.3数组的下标越界 146
11.1.4倒序存放数据 147
11.1.5将数组的长度定义为常量 148
11.1.6新手容易犯的错误 149
11.1.7数组的初始化 149
11.2数组的实例 150
11.2.1求平均成绩 150
11.2.2斐波那契数列 151
11.2.3查找最大数 152
11.2.4.查找某数 154
11.3排序算法 155
11.3.1冒泡排序法 155
11.3.2选择排序法 157
11.3.3插入排序法 160
11.4数组在内存中的分布 163
11.5数组名 165
11.6数组名的地址 165
11.7数组与指针 166
11.7.1利用指针输出数组元素 166
11.7.2查找最大数 167
11.8数组与枚举常量 168
11.9什么是多维数组 169
11.10多维数组的初始化 170
11.11 打印杨辉三角形(1) 171
11.12打印杨辉三角形(2) 172
11.13总结 174
第12章 字符串 175
12.1字符数组 175
12.1.1定义字符数组 175
12.1.2初始化字符数组 175
12.1.3输出字符数组中的所有字符 176
12.2字符串 177
12.2.1字符串的初始化 177
12.2.2字符串的输入 178
12.2.3字符串输入的常见问题 179
12.3常用字符串函数 180
12.3.1 strlen函数——得到字符串长度 180
12.3.2 strlwr函数——将大写转为小写 180
12.3.3 strupr函数——将小写转为大写 181
12.3.4 puts函数——字符串输出 181
12.3.5 strcpy函数——字符串复制 182
12.3.6 memcpy函数——内存复制 182
12.3.7 memccpy函数——内存复制 183
12.3.8 strcat函数——字符串连接 184
12.3.9 strncat函数——连接n个字符 184
12.3.10 strchr函数——查找字符 185
12.3.11 strset函数——设置字符串 186
12.3.12 strcmp函数——比较字符串 186
12.3.13 strrev函数——反转字符串 187
12.3.14 strstr函数——查找子串 188
12.3.15常见的字符串函数列表 188
12.4字符串函数的实现思路 189
12.4.1 strlen函数的实现思路 189
12.4.2 strcat函数的实现思路 189
12.4.3 strcpy函数的实现思路 190
12.4.4 strcmp函数的实现思路 191
12.4.5 strrev函数的实现思路 192
12.5字符串函数的应用实例 192
12.5.1 密码验证 193
12.5.2插入字符串 194
12.5.3姓名排序 195
12.6指针与字符串 197
12.6.1字符指针 197
12.6.2字符串常量 198
12.6.3删除字符串中的字符 198
12.6.4字符指针数组 199
12.6.5指向指针的指针 200
12.6.6英语词典 201
12.7总结 203
第13章 结构体和共用体 204
13.1什么是结构体 204
13.2什么是结构变量 204
13.3结构变量的多种定义方式 205
13.4结构变量的简单应用 206
13.5结构变量的初始化 207
13.6结构变量的赋值 208
13.7结构体数组 209
13.8英汉词典 210
13.9结构体的嵌套 217
13.9.1在职员工档案登记系统 218
13.9.2退休员工档案登记系统 220
13.10结构体的大小 222
13.11结构体与指针 224
13.11.1指向结构体变量的指针 224
13.11.2指向结构体数组的指针 225
13.11.3指向结构体数组的指针运算 226
13.12结构体与typedef 227
13.13共用体 228
13.13.1共用体的大小 229
13.13.2共用体变量不能被初始化 229
13.13.3共用体类型可以在结构体类型中定义 230
13.13.4共用体的作用 231
13.14总结 232
第14章 深入函数 233
14.1函数的运行机理 233
14.2函数的特殊调用方式 235
14.3函数的求参顺序 235
14.4函数的嵌套调用 236
14.5函数的递归调用 237
14.5.1直接调用自身 237
14.5.2 间接调用自身 237
14.5.3 终止递归调用 238
14.5.4递归调用的用途 239
14.6指针作为函数参数 240
14.6.1按值传递 240
14.6.2按址传递 241
14.6.3实现系统库函数strlwr 242
14.7数组作为函数参数 243
14.8数组的长度作为函数参数 244
14.9数组只有一个原本 245
14.10数组形参退化为指针 246
14.11指针数组作为函数参数 247
14.12指向指针的指针作为函数参数 249
14.13结构体变量作为函数的参数 250
14.14结构体数组作为函数的参数 251
14.15内部函数 253
14.16外部函数 253
14.17可变参数 255
14.18外部变量 255
14.19静态变量 256
14.19.1静态局部变量 257
14.19.2静态局部变量的应用 258
14.19.3静态全局变量 259
14.19.4全局变量 260
14.20自动变量 260
14.21寄存器变量 261
14.22总结 261
第15章 预处理指令 262
15.1宏定义指令 262
15.1.1无参宏 262
15.1.2无参宏的注意事项 263
15.1.3无参宏的应用 263
15.1.4宏的嵌套定义 264
15.1.5#undef指令 265
15.1.6带参宏 265
15.1.7带参宏的注意事项 266
15.1.8带参宏与函数的区别 266
15.1.9带参宏的应用 267
15.1.10#运算符 267
15.1.11 可变参数 267
15.2包含文件指令 270
15.2.1 包含文件的方式 270
15.2.2头文件 271
15.3条件编译指令 273
15.3.1#if指令 273
15.3.2#elif指令 274
15.3.3#ifdef指令 274
15.3.4#ifdef的应用 275
15.3.5#ifndef的应用 276
15.4预定义的宏 276
15.5 assert()宏 279
15.6尝试编写一个简单的assert()宏 279
15.7总结 282
第16章 学生成绩管理系统 283
16.1模块1——菜单选择 284
16.2模块2——添加记录 284
16.3模块3——显示记录 285
16.4模块4——修改记录 286
16.5模块5——删除记录 287
16.6模块6——查找记录 288
16.7模块7——排序记录 288
16.8程序的入口——主函数 289
16.9完整程序 290
16.10总结 296
第17章 深入指针 298
17.1 void指针 298
17.1.1声明void指针 298
17.1.2 void指针的作用 299
17.1.3实现memset函数 301
17.2返回指针的函数 303
17.3函数指针 304
17.3.1声明函数指针 304
17.3.2为什么要使用函数指针 305
17.3.3 函数指针作为函数参数 307
17.3.4函数指针数组 308
17.3.5利用typedef简化函数指针类型的声明 309
17.4动态数组 311
17.4.1什么是动态数组 311
17.4.2多维动态数组 312
17.5链表 314
17.5.1什么是链表 314
17.5.2声明链表结构 315
17.5.3静态链表 315
17.5.4动态链表 316
17.5.5动态创建节点 317
17.5.6显示节点数据 320
17.5.7删除节点 321
17.5.8修改节点数据 322
17.5.9查找节点 323
17.5.10统计节点 324
17.5.11排序节点 324
17.5.12链表的应用 326
17.5.13完整的动态链表清单 327
第18章 位运算 336
18.1位运算符 336
18.1.1按位与运算符(&) 336
18.1.2为什么用补码来表示负数 337
18.1.3按位与运算符的用途——按位清零 339
18.1.4按位与运算符的用途——取指定位 340
18.1.5按位或运算符(|) 340
18.1.6按位或运算符的用途——将某数低4位取1 341
18.1.7异或运算符(∧) 341
18.1.8异或运算符的特点 342
18.1.9异或运算符的用途——使特定或全部位反转 342
18.1.10异或运算符的用途——不用临时变量来交换两个值 343
18.1.11取反运算符(~) 344
18.1.12取反运算符的用途——便于移植 344
18.1.13取反运算符的用途——提供遮罩 346
18.1.14左移运算符(<<) 346
18.1.15右移运算符(>>) 347
18.1.16位运算的注意事项 348
18.1.17位运算的实例1——输出整数的补码 349
18.1.18位运算的实例2——输出整数的原码 350
18.2复合赋值运算符 350
18.3位字段 351
18.3.1位字段的大小 353
18.3.2位字段的注意事项 354
18.3.3位字段的实例 356
18.3.4输出浮点数的二进制 359
18.4总结 360
第19章 文件 361
19.1文件概述 361
19.1.1文本文件与二进制文件 361
19.1.2文件名 362
19.2缓冲区 362
19.3流 363
19.3.1输入与输出设备 364
19.3.2什么是流 364
19.4流函数 368
19.5标准库中的流函数 370
19.5.1 vprintf函数 370
19.5.2 vfprintf函数 371
19.5.3 fprintf函数 372
19.5.4 vscanf函数 372
19.5.5 vfscanf函数 373
19.5.6 fscanf函数 373
19.5.7 puts函数 373
19.5.8 fputs函数 374
19.5.9 putchar函数 374
19.5.10 putc函数 375
19.5.11 fputc函数 378
19.5.12 gets函数 379
19.5.13 fgets函数 381
19.5.14 getchar函数 382
19.5.15 getchar函数须知 382
19.5.16 getc函数 384
19.5.17 fgetc函数 387
19.6非标准库中的流函数 388
19.6.1 putw函数 388
19.6.2 getw函数 388
19.7特殊的流函数 389
19.7.1 getch函数 389
19.7.2 getche函数 390
19.8文件的读写 390
19.8.1读取文本文件 391
19.8.2写入文本文件 393
19.8.3不调用fclose函数的后果 394
19.9以行为单位读写文件 395
19.9.1一次读取一行 395
19.9.2一次写入一个字符串 396
19.10格式化读写文件 397
19.10.1格式化写文件 397
19.10.2格式化读文件 398
19.11成块读写文件 398
19.11.1成块写文件 398
19.11.2成块读文件 400
19.11.3按结构块读写文件 401
19.12文件的多种打开方式 403
19.12.1打开方式为″r″ 404
19.12.2打开方式为″w″ 405
19.12.3打开方式为″r+″ 406
19.12.4打开方式为″w+″ 407
19.12.5打开方式为″a″ 408
19.12.6打开方式为″a+″ 409
19.12.7″r″、″w″、″r+″、″w+″、″a″、″a+″须知 410
19.12.8打开方式为″wb″和″rb″ 410
19.12.9打开方式为″rb+″与″wb+″ 412
19.12.10打开方式为″ab″ 413
19.12.11打开方式为″ab+″ 416
19.12.12″rb″、″wb″、″rb+″、″wb+″、″ab″、″ab+″须知 417
19.12.13打开文本文件和打开二进制文件的区别 417
19.13错误处理 418
19.13.1文件的权限不够 418
19.13.2读取错误 419
19.14随机读写文件 421
19.14.1 fseek函数 421
19.14.2 ftell函数 424
19.15统计文件内容 425
19.15.1统计英文文档 425
19.15.2统计中英混合文档 426
19.16文件操作 431
19.16.1文件改名 431
19.16.2删除文件 432
19.16.3删除目录 433
19.16.4创建目录 434
19.16.5列出指定目录中的文件和子目录 435
19.16.6查找文件 440
19.16.7创建临时文件 445
19.16.8产生临时文件名 446
19.16.9为临时文件名添加后缀 447
19.17文件内容操作 449
19.17.1查找文件中的字符串 449
19.17.2复制文件中的内容到另一文件 450
19.17.3删除文件中的字符串 452
19.17.4修改文件中的字符串 455
19.17.5添加字符串到文件中 457
19.18文件的分割与合并 460
19.18.1分割文件 460
19.18.2合并文件 463
19.19文件的加密与解密 466
19.20批量修改文件 468
19.21非标准文件操作函数 470
19.21.1 access函数 471
19.21.2 _mktemp函数 472
19.22总结 473
第20章 通讯录 474
20.1模块1——用户注册 475
20.2模块2——用户登录 479
20.3菜单1——申请登录系统 480
20.4菜单2——通讯录管理系统 481
20.5模块3——增加记录 482
20.6模块4——删除记录 483
20.7模块5——列出记录 484
20.8模块6——查找记录 485
20.9模块7——保存记录 486
20.10模块8——读取记录 487
20.11主模块——main函数 488
20.12完整程序 489
20.13总结 501
第21章 补充知识 502
21.1逗号、自加自减运算符 502
21.1.1逗号运算符 502
21.1.2逗号运算符的优先级 503
21.1.3逗号运算符的结合方向 504
21.1.4逗号的其他用途 504
21.1.5 自加、自减运算符的优先级 505
21.1.6 自加、自减运算符的结合方向 505
21.1.7未定义的行为 507
21.1.8总结 507
21.2可移植的整数类型 507
21.3头文件stdint.h 508
21.4 printf详解 512
21.4.1 printf中的格式符 512
21.4.2打印字符和字符串 513
21.4.3打印有符号整数 513
21.4.4打印无符号整数 513
21.4.5打印浮点数 514
21.4.6打印地址 515
21.4.7计算字符数%n 515
21.4.8打印百分号% 516
21.4.9 printf的修饰符 516
21.4.10修饰符n 517
21.4.11修饰符m 518
21.4.12修饰符m.n 519
21.4.13修饰符 519
21.4.14处理其他数据类型的修饰符 519
21.4.15标志(-) 522
21.4.16标志(+) 522
21.4.17标志(空格) 523
21.4.18标志(0) 523
21.4.19标志(#) 523
21.5 scanf详解 524
21.5.1 scanf中的格式符 524
21.5.2读入字符和字符串 525
21.5.3读入有符号整数 526
21.5.4读入无符号整数 527
21.5.5读入浮点数 527
21.5.6格式串中的分隔符 528
21.5.7输入地址 528
21.5.8计算字符数%n 529
21.5.9读入百分号% 529
21.5.10扫描集合%[] 530
21.5.11 scanf的修饰符 531
21.5.12域长修饰符 532
21.5.13修饰符 532
21.5.14 scanf的注意事项 533
21.6缓冲区与编译器 533
21.6.1设置缓冲区 534
21.6.2缓冲模式 537
21.6.3缓冲模式须知 540
21.6.4刷新缓冲区 540
21.7强制刷新缓冲区 541
21.7.1 Windows平台下强制刷新缓冲区 542
21.7.2 Linux平台下强制刷新缓冲区 543
21.7.3 自己写代码刷新输入缓冲区 544
21.7.4非即时性的检查 547
21.7.5利用fpurge函数刷新输入缓冲区 549
21.8 总结 550
附录A ASCII码对照表 551
附录B C语言的关键字 554
附录C 运算符的优先级 556
附录D C语言常用头文件列表 558
附录E C标准库(C89) 559
E.1 C标准头文件(C89) 559
E.2 C标准库函数(C89) 560
E.2.1标准数学函数 560
E.2.2标准输入输出函数 563
E.2.3标准字符串函数 568
E.2.4标准字符分类函数 572
E.2.5标准类型转换函数 573
E.2.6标准多字节处理函数 575
E.2.7标准内存分配函数 576
E.2.8标准算法函数 577
E.2.9标准整型算术函数 577
E.2.10标准环境接口函数 578
E.2.11 标准日期与时间函数 579
E.2.12标准本地化函数 580
E.2.13标准信号处理函数 580
E.2.14标准非局部跳转函数 581
E.2.15标准可变参数宏 581
E.2.16标准诊断宏 582
E.2.17标准宏 582
E.3 C标准库中的常量(C89) 583
E.3.1 检测数值范围的常量 583
E.3.2错误码常量 585
附录F C89增补1 587
F.1 #include<iso646.h> 587
F.2 #include<wchar.h> 588
F.3 #include<wctype.h> 593
附录G C99 594
G.1 #include<complex.h> 594
G.2 #include<tgmath.h> 595
G.3 #include<fenv.h> 596
G.4 #include<stdbool.h> 596
G.5 #include<stdint.h> 596
G.6 #include<inttypes.h> 602
附录H 主流集成开发环境 611
H.1主流集成开发环境的介绍 611
H.1.1 Code?Blocks? 611
H.1.2 Dev-C+++? 611
H.1.3 Microsoft Visual C+++6.0? 611
H.1.4 Microsoft Visual Studio? 612
H.2主流集成开发环境的安装与设置 612
H.2.1 Code?Blocks的安装与设置? 612
H.2.2 Dev-C+++的安装与设置? 615
H.2.3 Microsoft Visual C+++6.0的安装与设置? 619
H.2.4 Microsoft Visual Studio的安装与设置? 628
H.3主流集成开发环境的使用 631
H.3.1 Code?Blocks的使用? 631
H.3.2 Dev-C+++的使用? 634
H.3.3 Microsoft Visual C+++6.0的使用? 636
H.3.4 Microsoft Visual Studio 2010的使用? 638
后记 640