书籍详情
零基础学C语言(第2版)
作者:康莉, 李宽, 陈国建 等编著
出版社:机械工业出版社
出版时间:2012-04-01
ISBN:9787111372929
定价:¥59.00
购买这本书可以去
内容简介
《零基础学C语言(第2版)》站在零基础学习的角度,使初学者能尽快掌握C语言程序设计的精髓,并且少走弯路。在知识点讲解时,笔者采用由浅入深的逐级递进学习方式。本书一共分为4篇,循序渐进地讲述了C语言的语法规则和编程思想,从基本概念到具体实践、从入门知识到高阶主题、从语法语义到数据结构和算法都进行了详细的阐述。主要内容包括数据的存储和获取、屏幕的输入与输出、运算符、表达式、分支语句、循环语句、函数、数组、指针、字符串处理、结构体、共用体、枚举、位运算、文件处理、作用域、预处理、数据结构等知识点。最后一章通过一些常见的C语言面试题的解析,为读者踏入职场提供参考资料。《零基础学C语言(第2版)》非常适合无C语言基础或基础薄弱的程序员阅读,并可作为开发人员的参考手册。
作者简介
本书主要由康莉、李宽、陈国建编写,其他参与编写和资料整理的人员有:冯华君、刘博、刘燕、叶青、张军、张立娟、张艺、彭涛、徐磊、戎伟、朱毅、李佳、李玉涵、杨利润、杨春娇、武鹏、潘中强、王丹、王宁、王西莉、石淑珍、程彩红、邵毅、郑丹丹、郑海平、顾旭光。作 者2012年1月
目录
前言
第一篇 C语言基础
第1章 踏上征程前的思想动员 1
1.1 为什么选择C语言 1
1.2 如何学好C语言 2
1.3 语言概述 3
1.3.1 什么是语言 3
1.3.2 什么是机器语言 3
1.3.3 什么是汇编语言 4
1.3.4 面向过程的语言 4
1.3.5 什么是C语言 4
1.4 深刻认识程序如何开发出来—程序开发周期 5
1.4.1 编辑C源代码 6
1.4.2 编译C源代码 6
1.4.3 连接目标文件 7
1.4.4 编译连接过程示例 7
1.4.5 运行程序 9
1.5 VC++、C++、C和TC—认识开发环境和语言的区别 9
1.6 小结 11
1.7 上机实践 11
第2章 跟我写Hello World 12
2.1 自己动手创建程序 12
2.2 认识LCC-Win32开发环境 12
2.2.1 为什么选择LCC-Win32 13
2.2.2 启动LCC-Win32 13
2.2.3 新建Hello World工程 13
2.2.4 定义新工程 13
2.2.5 添加源代码到工程 14
2.2.6 编译器设置 15
2.2.7 连接器设置 15
2.2.8 调试器设置 15
2.2.9 开始编辑代码 16
2.3 编译运行—欣赏你的杰作 17
2.4 查看代码如何一步一步被执行—调试排错(debug) 18
2.4.1 debug一词的由来 18
2.4.2 设置断点 19
2.4.3 调试运行 19
2.5 小结 20
2.6 上机实践 20
第3章 分解HelloWorld—最简单C程序的组成 22
3.1 C程序概貌 22
3.2 为何有必要在代码里留下程序员的解释—注释 23
3.3 从哪里开始,到哪里结束—main函数 24
3.4 如何在屏幕上显示文字—函数调用 25
3.5 编译器如何认识printf函数—#include预处理器指示符 26
3.5.1 函数声明及其作用 26
3.5.2 试验寻找#include的作用 27
3.5.3 #include的作用 28
3.6 计算1+1—有些小作为的程序 29
3.7 数据从哪里来,又到哪里去—变量 30
3.7.1 变量在内存中的表现形式 30
3.7.2 编译器使用变量符号表 30
3.7.3 变量及其使用 31
3.8 自己设计C函数 32
3.8.1 在main函数中计算3个整数的平均数 33
3.8.2 在main函数中分3次计算3个整数的平均数 33
3.8.3 自编函数实现计算3个整数的平均数 34
3.8.4 如何自编写函数 35
3.8.5 试验观察总结函数声明和函数定义的意义 36
3.9 语句构成程序 37
3.10 向好程序员看齐—代码风格 38
3.11 小结 38
3.12 上机实践 38
第4章 如何存储和获取数据—变量及数据类型 40
4.1 二进制、八进制、十六进制 40
4.2 计算机中如何表示数据—字节和位 41
4.3 内存是存储数据的“房间”—认识计算机内存 43
4.4 数据类型 43
4.4.1 整数类型 44
4.4.2 整数的正负—有符号和无符号 46
4.4.3 实数类型 47
4.4.4 字符类型 48
4.4.5 数据类型总结 48
4.5 常量 49
4.5.1 直接常量(字面常量)和符号常量 49
4.5.2 符号常量的优点 51
4.5.3 字面常量的书写格式 52
4.5.4 转义字符 53
4.5.5 字符串 55
4.6 变量 55
4.6.1 变量的声明 56
4.6.2 变量声明的意义 56
4.6.3 标识符和关键字 57
4.6.4 变量在内存中占据的空间和变量的值 60
4.6.5 变量赋初值 62
4.7 几个与变量相关的经典算法 63
4.7.1 累加和累乘 63
4.7.2 交换两个变量的值 65
4.8 小结 66
4.9 上机实践 66
第5章 用屏幕和键盘交互—简单的输出和输入 68
5.1 输入—处理—输出:这就是程序 68
5.2 向屏幕输出—printf函数详解 68
5.2.1 printf函数的一般形式 69
5.2.2 格式字符串的一般形式 71
5.2.3 %d—十进制形式输出带符号整数 71
5.2.4 %最小宽度d格式符 72
5.2.5 %ld格式符—以长整型方式输出 73
5.2.6 %o格式符—以八进制形式输出整数 73
5.2.7 %x格式符—以十六进制的形式输出整数 74
5.2.8 %u格式符—以十进制形式输出unsigned型数据 74
5.2.9 %c格式符 75
5.2.10 %s格式符—输出字符串 76
5.2.11 %f格式符—输出实型数据 78
5.2.12 %e格式符—以指数形式输出实数 79
5.2.13 %g格式符—自动选择%f或者%e形式输出 80
5.2.14 printf函数小结 80
5.3 字符输出putchar和字符串输出puts 81
5.3.1 putchar函数(字符输出函数) 81
5.3.2 puts函数(字符串输出函数) 83
5.4 接收键盘输入—scanf函数详解 84
5.4.1 一般形式 84
5.4.2 scanf函数的工作原理 85
5.4.3 多数据输入分隔规则 86
5.4.4 格式字符 88
5.4.5 scanf使用方法说明 89
5.4.6 使用scanf函数的注意事项 91
5.5 字符输入函数getchar 93
5.6 输入输出程序举例 94
5.7 小结 97
5.8 上机实践 97
第6章 程序的基本构成—运算符和表达式 98
6.1 认识C中的运算符和表达式 98
6.1.1 认识运算符和表达式 98
6.1.2 操作数、运算符和表达式 99
6.1.3 C运算符简介 99
6.2 算术运算符和算术表达式 100
6.2.1 基本的算术运算符 100
6.2.2 ++自增、--自减运算符 102
6.2.3 算术表达式和运算符的优先级及结合性 104
6.3 逗号运算符和逗号表达式 105
6.3.1 逗号表达式的一般形式 105
6.3.2 逗号表达式的优先级和结合性 106
6.4 关系运算符和关系表达式 107
6.4.1 关系运算符的种类 107
6.4.2 关系表达式的一般形式 107
6.5 逻辑运算符和逻辑表达式 109
6.5.1 逻辑运算符 109
6.5.2 逻辑真值表 109
6.6 赋值运算符和赋值表达式 110
6.6.1 赋值表达式 110
6.6.2 复合赋值运算符 111
6.6.3 类型转换 111
6.6.4 左值与程序实体 112
6.7 强制类型转换和自动类型转换 112
6.7.1 强制类型转换 112
6.7.2 自动类型转换 113
6.7.3 函数调用时的转换 115
6.8 运算符的优先级 115
6.8.1 优先级、结合性汇总 115
6.8.2 短路表达式 116
6.8.3 sizeof运算符与sizeof表达式 116
6.9 小结 116
6.10 上机实践 117
第7章 程序的最小独立单元—语句 118
7.1 5种语句类型 118
7.1.1 表达式语句 118
7.1.2 函数调用语句 119
7.1.3 空语句 119
7.1.4 复合语句(块语句) 119
7.1.5 流程控制语句 120
7.2 结构化程序设计 120
7.2.1 什么是算法 120
7.2.2 算法的表示 120
7.2.3 算法的伪代码表示 121
7.2.4 算法的流程图表示 121
7.2.5 3种控制结构 121
7.2.6 算法示例 122
7.3 小结 122
7.4 上机实践 122
第8章 条件判断—分支结构 123
8.1 简单的条件判断—if语句 123
8.1.1 判断表达式 123
8.1.2 花括号和if结构体 124
8.2 两条岔路的选择—if else结构 125
8.2.1 关键在else 125
8.2.2 if else结构体 126
8.3 多分支语句和分支语句嵌套 127
8.3.1 多分支 127
8.3.2 多分支if结构 128
8.3.3 分支语句嵌套 130
8.4 开关语句—switch结构 131
8.4.1 一般形式 131
8.4.2 为什么叫开关语句 133
8.4.3 default语句 135
8.4.4 if结构和switch结构之比较 135
8.5 小结 135
8.6 上机实践 135
第9章 一遍又一遍—循环结构 137
9.1 构造循环 137
9.1.1 循环的条件 137
9.1.2 当型循环和直到型循环 138
9.2 简洁循环语句—while和do while结构 138
9.2.1 语法规则 139
9.2.2 代码块 140
9.3 最常用的循环语句—for结构 140
9.3.1 基本形式 140
9.3.2 表达式省略 142
9.3.3 循环终止和步长 143
9.4 循环嵌套 143
9.4.1 嵌套示例 144
9.4.2 嵌套的效率 144
9.5 与循环密切相关的流程转向控制语句 145
9.5.1 跳出循环—break 145
9.5.2 重来一次—continue 146
9.5.3 随心所欲—goto 147
9.6 小结 148
9.7 上机实践 148
第二篇 一窥C语言门庭
第10章 写程序就是写函数—函数入门 149
10.1 什么是函数—根据输入进行处理返回输出 149
10.1.1 分割 149
10.1.2 库函数和自定义函数 150
10.2 自定义函数 150
10.2.1 定义的语法 150
10.2.2 函数定义范例 151
10.2.3 不要重复定义 152
10.3 函数调用与返回 152
10.3.1 形参和实参 152
10.3.2 传址调用 154
10.3.3 函数返回 155
10.4 告诉编译器有这么一个函数—函数原型声明 156
10.4.1 函数声明的语法 156
10.4.2 声明不同于定义 158
10.4.3 标准库函数的声明 158
10.5 面向过程的程序结构 158
10.5.1 模块化 159
10.5.2 函数的调用过程—模块的配合 159
10.5.3 一个入口一个出口 159
10.5.4 自顶向下,逐步求精 159
10.5.5 封装和可重用 160
10.5.6 高内聚,低耦合 160
10.6 小结 160
10.7 上机实践 161
第11章 同一类型多个元素的集合—简单数组 162
11.1 什么是数组 162
11.1.1 数组是一大片连续内存空间 162
11.1.2 数组元素的访问 163
11.2 一维数组 163
11.2.1 一维数组的声明 163
11.2.2 一维数组元素的访问 164
11.2.3 数组的初始化 164
11.2.4 不合法的数组操作 165
11.3 二维数组 166
11.3.1 二维数组的声明 166
11.3.2 二维数组的初始化 167
11.3.3 二维数组应用举例 167
11.4 更高维的数组 168
11.4.1 高维数组的声明和元素访问 169
11.4.2 初始化 169
11.4.3 多维数组在内存中是如何排列元素的 170
11.5 小结 170
11.6 上机实践 171
第12章 C语言难点—指针初探 172
12.1 计算机中的内存 172
12.1.1 内存地址 172
12.1.2 内存中保存的内容 173
12.1.3 地址就是指针 173
12.2 指针的定义 173
12.2.1 指针变量的声明 174
12.2.2 指针变量的初始化 174
12.2.3 指针变量的值 174
12.2.4 取地址操作符& 175
12.2.5 指针变量占据一定的内存空间 175
12.2.6 指向指针的指针 176
12.3 使用指针 176
12.3.1 运算符* 176
12.3.2 指针的类型和指针所指向的类型 177
12.3.3 同类型指针的赋值 178
12.3.4 指针的类型和指针所指向的类型不同 178
12.4 指针的运算 180
12.4.1 算术运算之“指针+整数”或“指针-整数” 180
12.4.2 指针-指针 181
12.4.3 指针的大小比较 182
12.5 指针表达式与左值 183
12.5.1 指针与整型 183
12.5.2 指针与左值 183
12.5.3 指针与const 183
12.6 动态内存分配 185
12.6.1 动态分配的好处 185
12.6.2 malloc与free函数 185
12.6.3 calloc与free函数 187
12.6.4 free函数与指针 187
12.6.5 内存泄漏 188
12.6.6 释放已经释放了的内存会出问题 188
12.7 小结 189
12.8 上机实践 189
第13章 字符串及字符串操作 190
13.1 C风格字符串 190
13.1.1 C风格字符串的声明 190
13.1.2 C风格字符串在内存中的表示 190
13.2 字符数组的输入输出 191
13.2.1 字符数组可以进行整体输入输出 191
13.2.2 使用gets函数读入整行输入 192
13.2.3 访问字符数组中某个元素 193
13.2.4 更便捷的输出—使用puts函数 193
13.3 字符串处理函数 194
13.3.1 理解:数组名是常指针 194
13.3.2 strlen函数与size_t 196
13.3.3 字符串复制函数strcpy 197
13.3.4 字符串比较函数strcmp 198
13.3.5 字符串连接函数strcat 199
13.3.6 全转换为大写形式 200
13.3.7 链式操作 201
13.4 小结 201
13.5 上机实践 201
第14章 结构体、共用体、枚举和typedef 203
14.1 结构体 203
14.1.1 结构体的定义 203
14.1.2 声明结构体变量 204
14.1.3 初始化结构变量 204
14.1.4 访问结构体成员 205
14.1.5 结构体定义的位置 205
14.1.6 结构体变量赋值 206
14.2 特殊结构体 207
14.2.1 结构体嵌套 207
14.2.2 匿名结构体 210
14.3 共用体 210
14.3.1 什么是共用体 210
14.3.2 共用体的定义 210
14.3.3 声明共用体变量 211
14.3.4 共用体变量的初始化 211
14.3.5 共用体成员访问 211
14.3.6 共用体赋值 213
14.4 结构体和共用体的内存差异 213
14.4.1 结构体变量和共用体变量内存形式的不同 213
14.4.2 结构体变量的内存大小 213
14.4.3 字节对齐 214
14.4.4 最宽基本类型 215
14.4.5 共用体的大小 216
14.5 枚举类型 216
14.5.1 枚举类型的定义 216
14.5.2 声明枚举变量 217
14.5.3 枚举常量是什么 217
14.6 给类型取个别名—typedef 218
14.6.1 typedef基本用法 218
14.6.2 #define用法 218
14.7 小结 219
14.8 上机实践 219
第15章 如何节省内存—位运算 220
15.1 什么是位运算 220
15.1.1 开灯关灯 220
15.1.2 改变状态 220
15.2 位逻辑运算符 221
15.2.1 位取反操作 221
15.2.2 位与运算 221
15.2.3 位或运算 221
15.2.4 位异或 221
15.2.5 实例分析 222
15.3 移位运算 223
15.3.1 基本形式 223
15.3.2 移位举例 223
15.4 小结 224
15.5 上机实践 224
第三篇 C语言进阶
第16章 存储不仅仅局限于内存—文件 227
16.1 什么是文件 227
16.1.1 文件 227
16.1.2 流 228
16.1.3 重定向 228
16.1.4 文件的处理形式—缓冲区和非缓冲区 228
16.1.5 文件的存储形式—文本形式和二进制形式 229
16.2 C语言如何使用文件 229
16.2.1 文件型指针 229
16.2.2 文件操作的步骤 230
16.3 文件的打开与关闭 230
16.3.1 打开文件—fopen 230
16.3.2 打开是否成功 231
16.3.3 关闭文件—fclose 232
16.4 文件的读写 232
16.4.1 读写的相对参照 232
16.4.2 如何判断文件已经结束 232
16.4.3 字符读写函数—fgetc和fputc 233
16.4.4 字符串读写函数—fgets和fputs 234
16.4.5 块读写函数—fread和fwrite 236
16.4.6 格式化文件输入输出—fprintf与fscanf 239
16.5 文件的定位 241
16.5.1 移到开头—rewind 241
16.5.2 得到当前位置—ftell 242
16.5.3 移动指针—fseek 242
16.6 小结 243
16.7 上机实践 243
第17章 灵活却难以理解—指针进阶 245
17.1 指针与数组 245
17.1.1 数组名指针 245
17.1.2 使用数组名常指针表示数组元素 246
17.1.3 指向数组元素的指针变量 246
17.1.4 指向数组的指针变量 247
17.1.5 指针数组 248
17.2 指针、结构体和结构体数组 249
17.2.1 两种访问形式 249
17.2.2 声明创建一个结构数组 249
17.2.3 结构数组的初始化 250
17.2.4 结构数组的使用 251
17.2.5 指向结构数组的指针 251
17.3 函数指针 252
17.3.1 函数名指针 252
17.3.2 指向函数的指针 253
17.3.3 函数指针类型 254
17.3.4 函数指针做函数参数 256
17.3.5 函数指针数组 256
17.3.6 指向函数指针的指针 258
17.4 小结 258
17.5 上机实践 258
第18章 更深入的理解—函数进阶 260
18.1 参数传递的副本机制 260
18.1.1 传值调用的副本机制 260
18.1.2 传址调用的副本机制 261
18.2 函数返回值的副本机制 264
18.2.1 return局部变量为什么合法 264
18.2.2 返回指针申请动态内存 265
18.2.3 不要返回指向栈内存的指针 266
18.2.4 返回指向只读存储区的指针 266
18.3 函数与结构体 267
18.3.1 结构体变量的传值和传址调用 267
18.3.2 结构体变量的成员作为函数参数 268
18.3.3 返回结构体的函数 269
18.3.4 返回结构体指针的函数 270
18.4 函数与数组 270
18.4.1 数组元素作为函数参数 270
18.4.2 数组名作为函数参数 271
18.4.3 多维数组名作为函数参数 273
18.4.4 数组名作为函数参数时的退化 274
18.5 递归 274
18.5.1 递归流程 274
18.5.2 递归两要素 276
18.5.3 效率与可读性 276
18.6 带参数的主函数 276
18.7 小结 277
18.8 上机实践 277
第19章 生存期、作用域与可见域 279
19.1 内存分配 279
19.1.1 内存分区 279
19.1.2 变量的存储类别 280
19.1.3 生存期 280
19.1.4 作用域与可见域 280
19.2 auto变量 281
19.2.1 定义格式 281
19.2.2 作用域和生存期 282
19.2.3 屏蔽 282
19.2.4 重复定义 283
19.2.5 初始化 284
19.3 register变量 284
19.3.1 定义格式 284
19.3.2 使用举例 285
19.4 extern变量 286
19.4.1 全局变量定义 286
19.4.2 全局变量声明 286
19.4.3 可见域 287
19.4.4 屏蔽 289
19.4.5 利与弊 290
19.5 static变量 291
19.5.1 定义格式 291
19.5.2 静态局部变量 291
19.5.3 静态全局变量 292
19.5.4 extern变量和static变量的初始化 293
19.6 函数的作用域与可见域 294
19.6.1 内部函数 294
19.6.2 外部函数 295
19.7 结构体定义的作用域与可见域 295
19.7.1 定义位置与可见域 295
19.7.2 允许重复定义 296
19.8 小结 297
19.9 上机实践 297
第20章 编译及预处理 299
20.1 编译流程 299
20.1.1 编辑 299
20.1.2 预处理 300
20.1.3 编译 300
20.1.4 连接 300
20.2 程序错误 301
20.2.1 错误分类 301
20.2.2 编译错误 301
20.2.3 连接错误 301
20.2.4 逻辑错误 302
20.2.5 排错 302
20.3 预处理命令之宏定义 302
20.3.1 宏定义 302
20.3.2 不带参数的宏定义 303
20.3.3 带参数的宏定义 304
20.3.4 #define定义常量与const常量 307
20.3.5 文件包含 307
20.3.6 条件编译 308
20.4 小结 310
20.5 上机实践 310
第21章 数据结构 311
21.1 链表 311
21.1.1 链表的结构 311
21.1.2 创建链表并遍历输出 312
21.1.3 链表的插入 314
21.1.4 链表结点的删除 317
21.1.5 链表的逆置 319
21.1.6 链表的销毁 321
21.1.7 综合实例 321
21.1.8 循环链表 326
21.1.9 双链表 327
21.2 栈和队列 330
21.2.1 栈的定义 330
21.2.2 栈的分类 330
21.2.3 栈的操作 331
21.2.4 函数与栈 333
21.2.5 队列 334
21.3 小结 337
21.4 上机实践 337
第四篇 C语言程序设计实例与面试题解析
第22章 C语言程序课程设计:游戏 339
22.1 黑白棋 339
22.1.1 程序功能要求 339
22.1.2 输入输出样例 339
22.1.3 程序分析 340
22.1.4 程序初始化 341
22.1.5 初始化图形设备 341
22.1.6 绘制棋盘 341
22.1.7 交替绘制黑白棋 342
22.1.8 游戏(同时判断是否有一方胜利) 342
22.1.9 小结 357
22.2 五子棋 357
22.2.1 程序功能要求 357
22.2.2 输入输出样例 358
22.2.3 程序分析 358
22.2.4 主函数程序设计 360
22.2.5 系统初始化 361
22.2.6 移动棋子模块 361
22.2.7 程序胜负判定 365
22.2.8 小结 369
22.3 扫雷游戏 369
22.3.1 程序功能要求 369
22.3.2 输入输出样例 370
22.3.3 程序分析 370
22.3.4 程序设计 372
22.3.5 初始化图形设备 374
22.3.6 事件处理模块 377
22.3.7 游戏处理部分 382
22.3.8 小结 385
22.4 速算24 385
22.4.1 程序功能要求 385
22.4.2 输入输出样例 385
22.4.3 程序分析 386
22.4.4 程序设计 387
22.4.5 扑克牌处理部分 389
22.4.6 程序运算部分 392
22.4.7 小结 393
第23章 面试题解析 394
23.1 基础知识 394
23.1.1 指针自增自减有什么不同 394
23.1.2 什么是递归 394
23.1.3 宏定义与操作符的区别 395
23.1.4 引用与值传递的区别 395
23.1.5 指针和引用有什么区别 395
23.1.6 什么是栈 395
23.1.7 main函数执行前还会执行什么代码 395
23.1.8 static有什么用途 395
23.1.9 定义int **a[3][4], 则变量占用的内存空间为多少 396
23.1.10 什么是预编译 396
23.1.11 int (*s[10])(int)表示什么意义 396
23.1.12 结构与联合有何区别 396
23.2 算法和思维逻辑知识 396
23.2.1 100美元哪里去了 397
23.2.2 将16升水平均分给四个人 397
23.2.3 算出小王买了几瓶啤酒、几瓶饮料 397
23.2.4 找出不同的苹果 398
23.2.5 找出不同的球 398
23.2.6 猜自己的帽子颜色 399
23.2.7 三筐水果各是什么 400
23.2.8 最后剩下的是谁 401
23.2.9 聪明的商人 402
23.2.10 红球和白球 402
23.2.11 乌龟赛跑 402
23.2.12 投硬币 402
附录 ASCII编码表 403
第一篇 C语言基础
第1章 踏上征程前的思想动员 1
1.1 为什么选择C语言 1
1.2 如何学好C语言 2
1.3 语言概述 3
1.3.1 什么是语言 3
1.3.2 什么是机器语言 3
1.3.3 什么是汇编语言 4
1.3.4 面向过程的语言 4
1.3.5 什么是C语言 4
1.4 深刻认识程序如何开发出来—程序开发周期 5
1.4.1 编辑C源代码 6
1.4.2 编译C源代码 6
1.4.3 连接目标文件 7
1.4.4 编译连接过程示例 7
1.4.5 运行程序 9
1.5 VC++、C++、C和TC—认识开发环境和语言的区别 9
1.6 小结 11
1.7 上机实践 11
第2章 跟我写Hello World 12
2.1 自己动手创建程序 12
2.2 认识LCC-Win32开发环境 12
2.2.1 为什么选择LCC-Win32 13
2.2.2 启动LCC-Win32 13
2.2.3 新建Hello World工程 13
2.2.4 定义新工程 13
2.2.5 添加源代码到工程 14
2.2.6 编译器设置 15
2.2.7 连接器设置 15
2.2.8 调试器设置 15
2.2.9 开始编辑代码 16
2.3 编译运行—欣赏你的杰作 17
2.4 查看代码如何一步一步被执行—调试排错(debug) 18
2.4.1 debug一词的由来 18
2.4.2 设置断点 19
2.4.3 调试运行 19
2.5 小结 20
2.6 上机实践 20
第3章 分解HelloWorld—最简单C程序的组成 22
3.1 C程序概貌 22
3.2 为何有必要在代码里留下程序员的解释—注释 23
3.3 从哪里开始,到哪里结束—main函数 24
3.4 如何在屏幕上显示文字—函数调用 25
3.5 编译器如何认识printf函数—#include预处理器指示符 26
3.5.1 函数声明及其作用 26
3.5.2 试验寻找#include的作用 27
3.5.3 #include的作用 28
3.6 计算1+1—有些小作为的程序 29
3.7 数据从哪里来,又到哪里去—变量 30
3.7.1 变量在内存中的表现形式 30
3.7.2 编译器使用变量符号表 30
3.7.3 变量及其使用 31
3.8 自己设计C函数 32
3.8.1 在main函数中计算3个整数的平均数 33
3.8.2 在main函数中分3次计算3个整数的平均数 33
3.8.3 自编函数实现计算3个整数的平均数 34
3.8.4 如何自编写函数 35
3.8.5 试验观察总结函数声明和函数定义的意义 36
3.9 语句构成程序 37
3.10 向好程序员看齐—代码风格 38
3.11 小结 38
3.12 上机实践 38
第4章 如何存储和获取数据—变量及数据类型 40
4.1 二进制、八进制、十六进制 40
4.2 计算机中如何表示数据—字节和位 41
4.3 内存是存储数据的“房间”—认识计算机内存 43
4.4 数据类型 43
4.4.1 整数类型 44
4.4.2 整数的正负—有符号和无符号 46
4.4.3 实数类型 47
4.4.4 字符类型 48
4.4.5 数据类型总结 48
4.5 常量 49
4.5.1 直接常量(字面常量)和符号常量 49
4.5.2 符号常量的优点 51
4.5.3 字面常量的书写格式 52
4.5.4 转义字符 53
4.5.5 字符串 55
4.6 变量 55
4.6.1 变量的声明 56
4.6.2 变量声明的意义 56
4.6.3 标识符和关键字 57
4.6.4 变量在内存中占据的空间和变量的值 60
4.6.5 变量赋初值 62
4.7 几个与变量相关的经典算法 63
4.7.1 累加和累乘 63
4.7.2 交换两个变量的值 65
4.8 小结 66
4.9 上机实践 66
第5章 用屏幕和键盘交互—简单的输出和输入 68
5.1 输入—处理—输出:这就是程序 68
5.2 向屏幕输出—printf函数详解 68
5.2.1 printf函数的一般形式 69
5.2.2 格式字符串的一般形式 71
5.2.3 %d—十进制形式输出带符号整数 71
5.2.4 %最小宽度d格式符 72
5.2.5 %ld格式符—以长整型方式输出 73
5.2.6 %o格式符—以八进制形式输出整数 73
5.2.7 %x格式符—以十六进制的形式输出整数 74
5.2.8 %u格式符—以十进制形式输出unsigned型数据 74
5.2.9 %c格式符 75
5.2.10 %s格式符—输出字符串 76
5.2.11 %f格式符—输出实型数据 78
5.2.12 %e格式符—以指数形式输出实数 79
5.2.13 %g格式符—自动选择%f或者%e形式输出 80
5.2.14 printf函数小结 80
5.3 字符输出putchar和字符串输出puts 81
5.3.1 putchar函数(字符输出函数) 81
5.3.2 puts函数(字符串输出函数) 83
5.4 接收键盘输入—scanf函数详解 84
5.4.1 一般形式 84
5.4.2 scanf函数的工作原理 85
5.4.3 多数据输入分隔规则 86
5.4.4 格式字符 88
5.4.5 scanf使用方法说明 89
5.4.6 使用scanf函数的注意事项 91
5.5 字符输入函数getchar 93
5.6 输入输出程序举例 94
5.7 小结 97
5.8 上机实践 97
第6章 程序的基本构成—运算符和表达式 98
6.1 认识C中的运算符和表达式 98
6.1.1 认识运算符和表达式 98
6.1.2 操作数、运算符和表达式 99
6.1.3 C运算符简介 99
6.2 算术运算符和算术表达式 100
6.2.1 基本的算术运算符 100
6.2.2 ++自增、--自减运算符 102
6.2.3 算术表达式和运算符的优先级及结合性 104
6.3 逗号运算符和逗号表达式 105
6.3.1 逗号表达式的一般形式 105
6.3.2 逗号表达式的优先级和结合性 106
6.4 关系运算符和关系表达式 107
6.4.1 关系运算符的种类 107
6.4.2 关系表达式的一般形式 107
6.5 逻辑运算符和逻辑表达式 109
6.5.1 逻辑运算符 109
6.5.2 逻辑真值表 109
6.6 赋值运算符和赋值表达式 110
6.6.1 赋值表达式 110
6.6.2 复合赋值运算符 111
6.6.3 类型转换 111
6.6.4 左值与程序实体 112
6.7 强制类型转换和自动类型转换 112
6.7.1 强制类型转换 112
6.7.2 自动类型转换 113
6.7.3 函数调用时的转换 115
6.8 运算符的优先级 115
6.8.1 优先级、结合性汇总 115
6.8.2 短路表达式 116
6.8.3 sizeof运算符与sizeof表达式 116
6.9 小结 116
6.10 上机实践 117
第7章 程序的最小独立单元—语句 118
7.1 5种语句类型 118
7.1.1 表达式语句 118
7.1.2 函数调用语句 119
7.1.3 空语句 119
7.1.4 复合语句(块语句) 119
7.1.5 流程控制语句 120
7.2 结构化程序设计 120
7.2.1 什么是算法 120
7.2.2 算法的表示 120
7.2.3 算法的伪代码表示 121
7.2.4 算法的流程图表示 121
7.2.5 3种控制结构 121
7.2.6 算法示例 122
7.3 小结 122
7.4 上机实践 122
第8章 条件判断—分支结构 123
8.1 简单的条件判断—if语句 123
8.1.1 判断表达式 123
8.1.2 花括号和if结构体 124
8.2 两条岔路的选择—if else结构 125
8.2.1 关键在else 125
8.2.2 if else结构体 126
8.3 多分支语句和分支语句嵌套 127
8.3.1 多分支 127
8.3.2 多分支if结构 128
8.3.3 分支语句嵌套 130
8.4 开关语句—switch结构 131
8.4.1 一般形式 131
8.4.2 为什么叫开关语句 133
8.4.3 default语句 135
8.4.4 if结构和switch结构之比较 135
8.5 小结 135
8.6 上机实践 135
第9章 一遍又一遍—循环结构 137
9.1 构造循环 137
9.1.1 循环的条件 137
9.1.2 当型循环和直到型循环 138
9.2 简洁循环语句—while和do while结构 138
9.2.1 语法规则 139
9.2.2 代码块 140
9.3 最常用的循环语句—for结构 140
9.3.1 基本形式 140
9.3.2 表达式省略 142
9.3.3 循环终止和步长 143
9.4 循环嵌套 143
9.4.1 嵌套示例 144
9.4.2 嵌套的效率 144
9.5 与循环密切相关的流程转向控制语句 145
9.5.1 跳出循环—break 145
9.5.2 重来一次—continue 146
9.5.3 随心所欲—goto 147
9.6 小结 148
9.7 上机实践 148
第二篇 一窥C语言门庭
第10章 写程序就是写函数—函数入门 149
10.1 什么是函数—根据输入进行处理返回输出 149
10.1.1 分割 149
10.1.2 库函数和自定义函数 150
10.2 自定义函数 150
10.2.1 定义的语法 150
10.2.2 函数定义范例 151
10.2.3 不要重复定义 152
10.3 函数调用与返回 152
10.3.1 形参和实参 152
10.3.2 传址调用 154
10.3.3 函数返回 155
10.4 告诉编译器有这么一个函数—函数原型声明 156
10.4.1 函数声明的语法 156
10.4.2 声明不同于定义 158
10.4.3 标准库函数的声明 158
10.5 面向过程的程序结构 158
10.5.1 模块化 159
10.5.2 函数的调用过程—模块的配合 159
10.5.3 一个入口一个出口 159
10.5.4 自顶向下,逐步求精 159
10.5.5 封装和可重用 160
10.5.6 高内聚,低耦合 160
10.6 小结 160
10.7 上机实践 161
第11章 同一类型多个元素的集合—简单数组 162
11.1 什么是数组 162
11.1.1 数组是一大片连续内存空间 162
11.1.2 数组元素的访问 163
11.2 一维数组 163
11.2.1 一维数组的声明 163
11.2.2 一维数组元素的访问 164
11.2.3 数组的初始化 164
11.2.4 不合法的数组操作 165
11.3 二维数组 166
11.3.1 二维数组的声明 166
11.3.2 二维数组的初始化 167
11.3.3 二维数组应用举例 167
11.4 更高维的数组 168
11.4.1 高维数组的声明和元素访问 169
11.4.2 初始化 169
11.4.3 多维数组在内存中是如何排列元素的 170
11.5 小结 170
11.6 上机实践 171
第12章 C语言难点—指针初探 172
12.1 计算机中的内存 172
12.1.1 内存地址 172
12.1.2 内存中保存的内容 173
12.1.3 地址就是指针 173
12.2 指针的定义 173
12.2.1 指针变量的声明 174
12.2.2 指针变量的初始化 174
12.2.3 指针变量的值 174
12.2.4 取地址操作符& 175
12.2.5 指针变量占据一定的内存空间 175
12.2.6 指向指针的指针 176
12.3 使用指针 176
12.3.1 运算符* 176
12.3.2 指针的类型和指针所指向的类型 177
12.3.3 同类型指针的赋值 178
12.3.4 指针的类型和指针所指向的类型不同 178
12.4 指针的运算 180
12.4.1 算术运算之“指针+整数”或“指针-整数” 180
12.4.2 指针-指针 181
12.4.3 指针的大小比较 182
12.5 指针表达式与左值 183
12.5.1 指针与整型 183
12.5.2 指针与左值 183
12.5.3 指针与const 183
12.6 动态内存分配 185
12.6.1 动态分配的好处 185
12.6.2 malloc与free函数 185
12.6.3 calloc与free函数 187
12.6.4 free函数与指针 187
12.6.5 内存泄漏 188
12.6.6 释放已经释放了的内存会出问题 188
12.7 小结 189
12.8 上机实践 189
第13章 字符串及字符串操作 190
13.1 C风格字符串 190
13.1.1 C风格字符串的声明 190
13.1.2 C风格字符串在内存中的表示 190
13.2 字符数组的输入输出 191
13.2.1 字符数组可以进行整体输入输出 191
13.2.2 使用gets函数读入整行输入 192
13.2.3 访问字符数组中某个元素 193
13.2.4 更便捷的输出—使用puts函数 193
13.3 字符串处理函数 194
13.3.1 理解:数组名是常指针 194
13.3.2 strlen函数与size_t 196
13.3.3 字符串复制函数strcpy 197
13.3.4 字符串比较函数strcmp 198
13.3.5 字符串连接函数strcat 199
13.3.6 全转换为大写形式 200
13.3.7 链式操作 201
13.4 小结 201
13.5 上机实践 201
第14章 结构体、共用体、枚举和typedef 203
14.1 结构体 203
14.1.1 结构体的定义 203
14.1.2 声明结构体变量 204
14.1.3 初始化结构变量 204
14.1.4 访问结构体成员 205
14.1.5 结构体定义的位置 205
14.1.6 结构体变量赋值 206
14.2 特殊结构体 207
14.2.1 结构体嵌套 207
14.2.2 匿名结构体 210
14.3 共用体 210
14.3.1 什么是共用体 210
14.3.2 共用体的定义 210
14.3.3 声明共用体变量 211
14.3.4 共用体变量的初始化 211
14.3.5 共用体成员访问 211
14.3.6 共用体赋值 213
14.4 结构体和共用体的内存差异 213
14.4.1 结构体变量和共用体变量内存形式的不同 213
14.4.2 结构体变量的内存大小 213
14.4.3 字节对齐 214
14.4.4 最宽基本类型 215
14.4.5 共用体的大小 216
14.5 枚举类型 216
14.5.1 枚举类型的定义 216
14.5.2 声明枚举变量 217
14.5.3 枚举常量是什么 217
14.6 给类型取个别名—typedef 218
14.6.1 typedef基本用法 218
14.6.2 #define用法 218
14.7 小结 219
14.8 上机实践 219
第15章 如何节省内存—位运算 220
15.1 什么是位运算 220
15.1.1 开灯关灯 220
15.1.2 改变状态 220
15.2 位逻辑运算符 221
15.2.1 位取反操作 221
15.2.2 位与运算 221
15.2.3 位或运算 221
15.2.4 位异或 221
15.2.5 实例分析 222
15.3 移位运算 223
15.3.1 基本形式 223
15.3.2 移位举例 223
15.4 小结 224
15.5 上机实践 224
第三篇 C语言进阶
第16章 存储不仅仅局限于内存—文件 227
16.1 什么是文件 227
16.1.1 文件 227
16.1.2 流 228
16.1.3 重定向 228
16.1.4 文件的处理形式—缓冲区和非缓冲区 228
16.1.5 文件的存储形式—文本形式和二进制形式 229
16.2 C语言如何使用文件 229
16.2.1 文件型指针 229
16.2.2 文件操作的步骤 230
16.3 文件的打开与关闭 230
16.3.1 打开文件—fopen 230
16.3.2 打开是否成功 231
16.3.3 关闭文件—fclose 232
16.4 文件的读写 232
16.4.1 读写的相对参照 232
16.4.2 如何判断文件已经结束 232
16.4.3 字符读写函数—fgetc和fputc 233
16.4.4 字符串读写函数—fgets和fputs 234
16.4.5 块读写函数—fread和fwrite 236
16.4.6 格式化文件输入输出—fprintf与fscanf 239
16.5 文件的定位 241
16.5.1 移到开头—rewind 241
16.5.2 得到当前位置—ftell 242
16.5.3 移动指针—fseek 242
16.6 小结 243
16.7 上机实践 243
第17章 灵活却难以理解—指针进阶 245
17.1 指针与数组 245
17.1.1 数组名指针 245
17.1.2 使用数组名常指针表示数组元素 246
17.1.3 指向数组元素的指针变量 246
17.1.4 指向数组的指针变量 247
17.1.5 指针数组 248
17.2 指针、结构体和结构体数组 249
17.2.1 两种访问形式 249
17.2.2 声明创建一个结构数组 249
17.2.3 结构数组的初始化 250
17.2.4 结构数组的使用 251
17.2.5 指向结构数组的指针 251
17.3 函数指针 252
17.3.1 函数名指针 252
17.3.2 指向函数的指针 253
17.3.3 函数指针类型 254
17.3.4 函数指针做函数参数 256
17.3.5 函数指针数组 256
17.3.6 指向函数指针的指针 258
17.4 小结 258
17.5 上机实践 258
第18章 更深入的理解—函数进阶 260
18.1 参数传递的副本机制 260
18.1.1 传值调用的副本机制 260
18.1.2 传址调用的副本机制 261
18.2 函数返回值的副本机制 264
18.2.1 return局部变量为什么合法 264
18.2.2 返回指针申请动态内存 265
18.2.3 不要返回指向栈内存的指针 266
18.2.4 返回指向只读存储区的指针 266
18.3 函数与结构体 267
18.3.1 结构体变量的传值和传址调用 267
18.3.2 结构体变量的成员作为函数参数 268
18.3.3 返回结构体的函数 269
18.3.4 返回结构体指针的函数 270
18.4 函数与数组 270
18.4.1 数组元素作为函数参数 270
18.4.2 数组名作为函数参数 271
18.4.3 多维数组名作为函数参数 273
18.4.4 数组名作为函数参数时的退化 274
18.5 递归 274
18.5.1 递归流程 274
18.5.2 递归两要素 276
18.5.3 效率与可读性 276
18.6 带参数的主函数 276
18.7 小结 277
18.8 上机实践 277
第19章 生存期、作用域与可见域 279
19.1 内存分配 279
19.1.1 内存分区 279
19.1.2 变量的存储类别 280
19.1.3 生存期 280
19.1.4 作用域与可见域 280
19.2 auto变量 281
19.2.1 定义格式 281
19.2.2 作用域和生存期 282
19.2.3 屏蔽 282
19.2.4 重复定义 283
19.2.5 初始化 284
19.3 register变量 284
19.3.1 定义格式 284
19.3.2 使用举例 285
19.4 extern变量 286
19.4.1 全局变量定义 286
19.4.2 全局变量声明 286
19.4.3 可见域 287
19.4.4 屏蔽 289
19.4.5 利与弊 290
19.5 static变量 291
19.5.1 定义格式 291
19.5.2 静态局部变量 291
19.5.3 静态全局变量 292
19.5.4 extern变量和static变量的初始化 293
19.6 函数的作用域与可见域 294
19.6.1 内部函数 294
19.6.2 外部函数 295
19.7 结构体定义的作用域与可见域 295
19.7.1 定义位置与可见域 295
19.7.2 允许重复定义 296
19.8 小结 297
19.9 上机实践 297
第20章 编译及预处理 299
20.1 编译流程 299
20.1.1 编辑 299
20.1.2 预处理 300
20.1.3 编译 300
20.1.4 连接 300
20.2 程序错误 301
20.2.1 错误分类 301
20.2.2 编译错误 301
20.2.3 连接错误 301
20.2.4 逻辑错误 302
20.2.5 排错 302
20.3 预处理命令之宏定义 302
20.3.1 宏定义 302
20.3.2 不带参数的宏定义 303
20.3.3 带参数的宏定义 304
20.3.4 #define定义常量与const常量 307
20.3.5 文件包含 307
20.3.6 条件编译 308
20.4 小结 310
20.5 上机实践 310
第21章 数据结构 311
21.1 链表 311
21.1.1 链表的结构 311
21.1.2 创建链表并遍历输出 312
21.1.3 链表的插入 314
21.1.4 链表结点的删除 317
21.1.5 链表的逆置 319
21.1.6 链表的销毁 321
21.1.7 综合实例 321
21.1.8 循环链表 326
21.1.9 双链表 327
21.2 栈和队列 330
21.2.1 栈的定义 330
21.2.2 栈的分类 330
21.2.3 栈的操作 331
21.2.4 函数与栈 333
21.2.5 队列 334
21.3 小结 337
21.4 上机实践 337
第四篇 C语言程序设计实例与面试题解析
第22章 C语言程序课程设计:游戏 339
22.1 黑白棋 339
22.1.1 程序功能要求 339
22.1.2 输入输出样例 339
22.1.3 程序分析 340
22.1.4 程序初始化 341
22.1.5 初始化图形设备 341
22.1.6 绘制棋盘 341
22.1.7 交替绘制黑白棋 342
22.1.8 游戏(同时判断是否有一方胜利) 342
22.1.9 小结 357
22.2 五子棋 357
22.2.1 程序功能要求 357
22.2.2 输入输出样例 358
22.2.3 程序分析 358
22.2.4 主函数程序设计 360
22.2.5 系统初始化 361
22.2.6 移动棋子模块 361
22.2.7 程序胜负判定 365
22.2.8 小结 369
22.3 扫雷游戏 369
22.3.1 程序功能要求 369
22.3.2 输入输出样例 370
22.3.3 程序分析 370
22.3.4 程序设计 372
22.3.5 初始化图形设备 374
22.3.6 事件处理模块 377
22.3.7 游戏处理部分 382
22.3.8 小结 385
22.4 速算24 385
22.4.1 程序功能要求 385
22.4.2 输入输出样例 385
22.4.3 程序分析 386
22.4.4 程序设计 387
22.4.5 扑克牌处理部分 389
22.4.6 程序运算部分 392
22.4.7 小结 393
第23章 面试题解析 394
23.1 基础知识 394
23.1.1 指针自增自减有什么不同 394
23.1.2 什么是递归 394
23.1.3 宏定义与操作符的区别 395
23.1.4 引用与值传递的区别 395
23.1.5 指针和引用有什么区别 395
23.1.6 什么是栈 395
23.1.7 main函数执行前还会执行什么代码 395
23.1.8 static有什么用途 395
23.1.9 定义int **a[3][4], 则变量占用的内存空间为多少 396
23.1.10 什么是预编译 396
23.1.11 int (*s[10])(int)表示什么意义 396
23.1.12 结构与联合有何区别 396
23.2 算法和思维逻辑知识 396
23.2.1 100美元哪里去了 397
23.2.2 将16升水平均分给四个人 397
23.2.3 算出小王买了几瓶啤酒、几瓶饮料 397
23.2.4 找出不同的苹果 398
23.2.5 找出不同的球 398
23.2.6 猜自己的帽子颜色 399
23.2.7 三筐水果各是什么 400
23.2.8 最后剩下的是谁 401
23.2.9 聪明的商人 402
23.2.10 红球和白球 402
23.2.11 乌龟赛跑 402
23.2.12 投硬币 402
附录 ASCII编码表 403
猜您喜欢