第1章 C语言编程 1
1.1 C语言 1
1.2标准库 2
1.3学习C 2
1.4创建C程序 2
1.4.1编辑 2
1.4.2编译 3
1.4.3链接 4
1.4.4执行 4
1.5创建第一个程序 5
1.6编辑第一个程序 5
1.7处理错误 6
1.8剖析一个简单的程序 7
1.8.1注释 7
1.8.2预处理指令 8
1.8.3定义main()函数 9
1.8.4关键字 10
1.8.5函数体 10
1.8.6输出信息 11
1.8.7参数 11
1.8.8控制符 11
1.8.9三字母序列 13
1.9预处理器 14
1.10用C语言开发程序 14
1.10.1了解问题 14
1.10.2详细设计 15
1.10.3实施 15
1.10.4测试 15
1.11函数及模块化编程 16
1.12常见错误 19
1.13要点 19
1.14小结 20
1.15习题 20
第2章 编程初步 21
2.1计算机的内存 21
2.2什么是变量 23
2.3存储整数的变量 24
2.3.1变量的使用 28
2.3.2变量的初始化 29
2.4变量与内存 36
2.4.1带符号的整数类型 36
2.4.2无符号的整数类型 37
2.4.3指定整数常量 37
2.5使用浮点数 39
2.6浮点数变量 41
2.6.1使用浮点数完成除法运算 42
2.6.2控制输出中的小数位数 43
2.6.3控制输出的字段宽度 43
2.7较复杂的表达式 44
2.8定义命名常量 46
2.8.1极限值 49
2.8.2 sizeof运算符 51
2.9选择正确的类型 52
2.10强制类型转换 55
2.10.1自动转换类型 56
2.10.2隐式类型转换的规则 56
2.10.3赋值语句中的隐式类型转换 57
2.11再谈数值数据类型 58
2.11.1字符类型 58
2.11.2字符的输入输出 59
2.11.3枚举 62
2.11.4存储布尔值的变量 64
2.12赋值操作的op=形式 65
2.13数学函数 66
2.14设计一个程序 67
2.14.1问题 68
2.14.2分析 68
2.14.3解决方案 70
2.15小结 73
2.16练习 74
第3章 条件判断 75
3.1判断过程 75
3.1.1算术比较 75
3.1.2基本的if语句 76
3.1.3扩展if语句:if-else 79
3.1.4在if语句中使用代码块 82
3.1.5嵌套的if语句 83
3.1.6测试字符 85
3.1.7逻辑运算符 88
3.1.8条件运算符 91
3.1.9运算符的优先级 94
3.2多项选择问题 98
3.2.1给多项选择使用else-if语句 98
3.2.2 switch语句 99
3.2.3 goto语句 107
3.3按位运算符 108
3.3.1按位运算符的op=用法 110
3.3.2使用按位运算符 111
3.4设计程序 114
3.4.1问题 114
3.4.2分析 114
3.4.3解决方案 114
3.5小结 118
3.6练习 118
第4章 循环 119
4.1循环 119
4.2递增和递减运算符 120
4.3 for循环 120
4.4 for循环的一般语法 124
4.5再谈递增和递减运算符 125
4.5.1递增运算符 125
4.5.2递增运算符的前置和后置形式 125
4.5.3递减运算符 126
4.6再论for循环 127
4.6.1修改for循环变量 129
4.6.2没有参数的for循环 129
4.6.3循环内的break语句 130
4.6.4使用for循环限制输入 132
4.6.5生成伪随机整数 135
4.6.6再谈循环控制选项 137
4.6.7浮点类型的循环控制变量 137
4.7 while循环 138
4.8嵌套循环 140
4.9嵌套循环和goto语句 146
4.10 do-while循环 147
4.11 continue语句 149
4.12设计程序 150
4.12.1问题 150
4.12.2分析 150
4.12.3解决方案 151
4.13小结 162
4.14习题 163
第5章 数组 165
5.1数组简介 165
5.1.1不用数组的程序 165
5.1.2什么是数组 167
5.1.3使用数组 168
5.2寻址运算符 171
5.3数组和地址 173
5.4数组的初始化 174
5.5确定数组的大小 175
5.6多维数组 176
5.7多维数组的初始化 178
5.8变长数组 184
5.9设计一个程序 186
5.9.1问题 186
5.9.2分析 186
5.9.3解决方案 187
5.10小结 193
5.11习题 193
第6章 字符串和文本的应用 195
6.1什么是字符串 195
6.2存储字符串的变量 197
6.3字符串操作 202
6.3.1检查对C11的支持 202
6.3.2确定字符串的长度 203
6.3.3复制字符串 204
6.3.4连接字符串 204
6.3.5比较字符串 208
6.3.6搜索字符串 211
6.3.7单元化字符串 215
6.3.8将换行符读入字符串 219
6.4分析和转换字符串 221
6.4.1转换字符的大小写形式 223
6.4.2将字符串转换成数值 225
6.5设计一个程序 227
6.5.1问题 227
6.5.2分析 227
6.5.3解决方案 228
6.6小结 233
6.7习题 233
第7章 指针 235
7.1指针初探 235
7.1.1声明指针 236
7.1.2通过指针访问值 237
7.1.3使用指针 240
7.1.4指向常量的指针 244
7.1.5常量指针 244
7.1.6指针的命名 245
7.2数组和指针 245
7.3多维数组 248
7.3.1多维数组和指针 252
7.3.2访问数组元素 253
7.4内存的使用 256
7.4.1动态内存分配:malloc()函数 256
7.4.2释放动态分配的内存 257
7.4.3用calloc()函数分配内存 261
7.4.4扩展动态分配的内存 262
7.5使用指针处理字符串 265
7.5.1使用指针数组 266
7.5.2指针和数组记号 272
7.6设计程序 276
7.6.1问题 276
7.6.2分析 277
7.6.3解决方案 277
7.7小结 284
7.8习题 285
第8章 编程的结构 287
8.1程序的结构 287
8.1.1变量的作用域和生存期 288
8.1.2变量的作用域和函数 291
8.2函数 291
8.2.1定义函数 291
8.2.2 return语句 294
8.3按值传递机制 299
8.4函数原型 300
8.5指针用作参数和返回值 301
8.5.1常量参数 302
8.5.2返回指针的风险 307
8.6小结 310
8.7习题 310
第9章 函数再探 313
9.1函数指针 313
9.1.1声明函数指针 313
9.1.2通过函数指针调用函数 314
9.1.3函数指针的数组 316
9.1.4作为变元的函数指针 319
9.2函数中的变量 321
9.2.1静态变量:函数内部的追踪 321
9.2.2在函数之间共享变量 323
9.3调用自己的函数:递归 325
9.4变元个数可变的函数 328
9.4.1复制va list 331
9.4.2长度可变的变元列表的基本规则 331
9.5 main()函数 332
9.6结束程序 333
9.6.1 abort()函数 333
9.6.2 exit()和atexit()函数 333
9.6.3 Exit()函数 334
9.6.4 quick_exit()和at_quick_exit()函数 334
9.7提高性能 335
9.7.1内联声明函数 335
9.7.2使用restrict关键字 335
9.7.3 Noretum函数限定符 336
9.8设计程序 336
9.8.1问题 336
9.8.2分析 337
9.8.3解决方案 338
9.9小结 351
9.10习题 352
第10章 基本输入和输出操作 353
10.1输入和输出流 353
10.2标准流 354
10.3键盘输入 354
10.3.1格式化键盘输入 355
10.3.2输入格式控制字符串 355
10.3.3输入格式字符串中的字符 360
10.3.4输入浮点数的各种变化 362
10.3.5读取十六进制和八进制值 363
10.3.6用scanf_s()读取字符 364
10.3.7从键盘上输入字符串 366
10.3.8单个字符的键盘输入 367
10.4屏幕输出 372
10.4.1使用printf_s()的格式化输出 372
10.4.2转义序列 375
10.4.3整数输出 375
10.4.4输出浮点数 378
10.4.5字符输出 379
10.5其他输出函数 380
10.5.1屏幕的非格式化输出 381
10.5.2数组的格式化输出 381
10.5.3数组的格式化输入 382
10.6小结 382
10.7习题 383
第11章 结构化数据 385
11.1数据结构:使用struct 385
11.1.1定义结构类型和结构变量 387
11.1.2访问结构成员 388
11.1.3未命名的结构 390
11.1.4结构数组 391
11.1.5表达式中的结构成员 393
11.1.6结构指针 393
11.1.7为结构动态分配内存 394
11.2再探结构成员 397
11.2.1将一个结构作为另一个结构的成员 397
11.2.2声明结构中的结构 398
11.2.3将结构指针用作结构成员 399
11.2.4双向链表 403
11.2.5结构中的位字段 406
11.3结构与函数 407
11.3.1结构作为函数的变元 407
11.3.2结构指针作为函数变元 408
11.3.3作为函数返回值的结构 409
11.3.4二叉树 414
11.4共享内存 421
11.5设计程序 425
11.5.1问题 425
11.5.2分析 426
11.5.3解决方案 426
11.6小结 438
11.7习题 438
第12章 处理文件 441
12.1文件的概念 441
12.1.1文件中的位置 442
12.1.2文件流 442
12.2文件访问 442
12.2.1打开文件 443
12.2.2缓存文件操作 445
12.2.3文件重命名 446
12.2.4关闭文件 447
12.2.5删除文件 447
12.3写入文本文件 448
12.4读取文本文件 449
12.5在文本文件中读写字符串 452
12.6格式化文件的输入输出 456
12.6.1格式化文件输出 456
12.6.2格式化文件输入 457
12.7错误处理 459
12.8再探文本文件操作模式 460
12.9 freopen_s()函数 461
12.10二进制文件的输入输出 462
12.10.1以二进制模式打开文件 462
12.10.2写入二进制文件 463
12.10.3读取二进制文件 464
12.11在文件中移动 469
12.11.1文件定位操作 469
12.11.2找出我们在文件中的位置 470
12.11.3在文件中设定位置 471
12.12使用临时文件 477
12.12.1创建临时文件 477
12.12.2创建唯一的文件名 478
12.13更新二进制文件 479
12.13.1修改文件的内容 484
12.13.2从键盘输入创建记录 485
12.13.3将记录写入文件 486
12.13.4从文件中读取记录 486
12.13.5写入文件 487
12.13.6列出文件内容 488
12.13.7更新已有的文件内容 489
12.14文件打开模式小结 495
12.15设计程序 496
12.15.1问题 496
12.15.2分析 496
12.15.3解决方案 496
12.16小结 501
12.17习题 501
第13章 支持功能 503
13.1预处理 503
13.1.1在程序中包含头文件 503
13.1.2定义自己的头文件 504
13.1.3管理多个源文件 504
13.1.4外部变量 505
13.1.5静态函数 505
13.1.6替换程序源代码 506
13.2宏 507
13.2.1看起来像函数的宏 507
13.2.2字符串作为宏参数 509
13.2.3在宏展开式中结合两个变元 510
13.3多行上的预处理器指令 510
13.3.1预处理器逻辑指令 511
13.3.2条件编译 511
13.3.3测试多个条件 512
13.3.4取消定义的标识符 512
13.3.5测试标识符的指定值的指令 512
13.3.6多项选择 513
13.3.7标准预处理宏 514
13.4调试方法 515
13.4.1集成的调试器 515
13.4.2调试阶段的预处理器 515
13.4.3断言 519
13.5日期和时间函数 521
13.5.1获取时间值 522
13.5.2获取日期 525
13.5.3确定某一天是星期几 529
13.6小结 531
13.7习题 531
第14章 高级专用主题 533
14.1使用国际字符集 533
14.1.1理解Unicode 533
14.1.2设置区域 534
14.1.3宽字符类型wchar_t 535
14.1.4宽字符串的操作 537
14.1.5宽字符的文件流操作 540
14.1.6存储Unicode字符的固定大小类型 541
14.2用于可移植性的专用整数类型 545
14.2.1固定宽度的整型 545
14.2.2最小宽度的整型 545
14.2.3最大宽度的整型 546
14.3复数类型 546
14.3.1复数基础 546
14.3.2复数类型和操作 547
14.4用线程编程 550
14.4.1创建线程 550
14.4.2退出线程 551
14.4.3把一个线程连接到另一个线程上 552
14.4.4挂起线程 555
14.4.5管理线程对数据的访问 555
14.5小结 561
附录A 计算机中的数学知识 563
附录B ASCII字符代码定义 571
附录C C语言中的保留字 575
附录D 输入输出格式说明符 577
附录E 标准库头文件 583