原创作者: 王桂林
技术交流:QQ 329973169
零基础入门 C 语言
人生除了眼前的苟且,还有 C++和远方。
Author:王桂林
Mail
:
guilin_wang@163.com
1
原创作者: 王桂林
技术交流:QQ 329973169
版本信息:
版本
V1.0
V1.1
修订人
王桂林
王桂林
审阅人
时间
组织
2016.02.02
2016.11.01
广州小码哥教育科技有限公司
2
原创作者: 王桂林
技术交流:QQ 329973169
1. Hello World......................................................................................................................................1
1.1. 源程序.................................................................................................................................1
1.1.1. C 语言版....................................................................................................................1
1.1.2. C++版.........................................................................................................................1
1.1.3. hello word collection.................................................................................................1
1.2. 注释.....................................................................................................................................1
1.3. 从源程序到可执行程序.....................................................................................................2
1.3.1. 集成开发环境:......................................................................................................2
1.3.2. 手动编译:..............................................................................................................2
1.4. 致敬大师.............................................................................................................................3
2. Linux 常用基础命令...................................................................................................................... 5
2.1. 版本选择.............................................................................................................................5
2.1.1. 内核版本..................................................................................................................5
2.1.2. 发行版本..................................................................................................................5
2.2. 目录结构.............................................................................................................................6
2.2.1. 系统目录..................................................................................................................6
2.2.2. 分区与目录..............................................................................................................8
2.3. 常用命令...........................................................................................................................10
2.3.1. 命令格式................................................................................................................10
2.3.2. 目录切换................................................................................................................10
2.3.3. 文件操作................................................................................................................10
2.3.4. 用户管理................................................................................................................11
2.3.5. 网络命令................................................................................................................11
2.3.6. Ubuntu 下软件安装............................................................................................... 11
2.4. vim 文本编辑.....................................................................................................................11
2.4.1. vim 编辑器中有三种状态模式............................................................................. 12
2.4.2. vim 编辑器的启动与退出......................................................................................12
2.4.3. 文件操作................................................................................................................12
2.4.4. 光标移动操作........................................................................................................12
2.4.5. 编辑操作................................................................................................................13
2.4.6. 查找与替换操作....................................................................................................13
2.4.7. 学习工具 vimtutor................................................................................................ 14
2.4.8. vim 最简易配置.....................................................................................................14
2.4.9. vim 与 HHKB...........................................................................................................14
3. C 语言与自然语言........................................................................................................................16
3.1. 语法规则...........................................................................................................................16
3.2. 程序与流程.......................................................................................................................16
3.2.1. 程序........................................................................................................................16
3.2.2. 流程和流程图........................................................................................................17
3.2.3. 常用制图工具........................................................................................................18
4. 常/变量与数据类型(DataType).................................................................................................. 19
4.1. C 语言中的关键字.............................................................................................................19
4.2. 变量(Variable)................................................................................................................... 19
4.2.1. 变量的定义............................................................................................................19
3
原创作者: 王桂林
技术交流:QQ 329973169
4.2.2. 变量的命名规则:............................................................................................... 19
4.2.3. 交换两个变量的内容........................................................................................... 20
4.2.4. 驼峰命名法............................................................................................................20
4.3. 内存模型...........................................................................................................................21
4.3.1. 物理基础................................................................................................................21
4.3.2. CPU 读写内存.........................................................................................................22
4.3.3. 读写流程:............................................................................................................22
4.3.4. 代码演示................................................................................................................23
4.4. 计算机的基石补码...........................................................................................................24
4.4.1. 计算机编码基础....................................................................................................24
4.4.2. 补码的编码规则....................................................................................................24
4.4.3. 小结........................................................................................................................26
4.5. 数据类型...........................................................................................................................26
4.5.1. 类型总揽................................................................................................................27
4.5.2. 基本类型之数值类型........................................................................................... 27
4.5.3. 基本类型之字符类型........................................................................................... 29
4.6. 常量(Constant)..................................................................................................................33
4.6.1. 常量类型................................................................................................................33
4.6.2. 常量的大小............................................................................................................34
4.7. 格式输入与输出...............................................................................................................35
4.7.1. printf........................................................................................................................35
4.7.2. scanf........................................................................................................................ 38
4.7.3. putchar && getchar.................................................................................................40
4.7.4. 输入输出缓冲........................................................................................................41
4.8. 类型转化(Type Cast).........................................................................................................41
4.8.1. 隐式转化................................................................................................................41
4.8.2. 强制转化................................................................................................................43
4.8.3. 浮点数跟 0 值比较............................................................................................... 43
4.9. 练习...................................................................................................................................44
4.9.1. printf 返回值有意义吗?...................................................................................... 44
5. 运算符与表达式(Operator&&Express).......................................................................................45
5.1. 运符符的优先级和结合性...............................................................................................45
5.2. 常见运符算符及构成的表达式...................................................................................... 47
5.2.1. 赋值运算符与赋值表达式................................................................................... 47
5.2.2. 算术运算符与算术表达式................................................................................... 48
5.2.3. 关系运算符与关系表达式................................................................................... 49
5.2.4. 逻辑运算符与逻辑表达式................................................................................... 50
5.2.5. 条件运算符与条件表达式................................................................................... 52
5.2.6. 逗号运算符与逗号表达式................................................................................... 53
5.2.7. sizeof 运算符及其表达式...................................................................................... 53
5.2.8. 小结........................................................................................................................54
5.3. 运算符综合练习...............................................................................................................55
5.3.1. if(x==y) 与 if(x=y) 之间的区别。........................................................................ 55
5.3.2. 表达式 3==3==3 的值是多少?................................................................... 55
4
原创作者: 王桂林
技术交流:QQ 329973169
5.3.3. 表达式 100<=a<=300,能表达[100,300]这样的区间吗?................................ 55
5.3.4. 如何判断,我们输入的字符在[a,z]之间。........................................................ 55
5.3.5. 求[100,999]内的水仙花数....................................................................................55
5.3.6. 判断输入的年份,是否为润年。....................................................................... 55
5.3.7. 判断数字是否是回文数。................................................................................... 55
6. 程序结构设计..............................................................................................................................56
6.1. 选择...................................................................................................................................56
6.1.1. If else....................................................................................................................... 56
6.1.2. switch...................................................................................................................... 59
6.1.3. 小结........................................................................................................................61
6.1.4. 练习判断按键........................................................................................................61
6.2. 循环...................................................................................................................................62
6.2.1. 循环三要素............................................................................................................62
6.2.2. while“当”型循环................................................................................................63
6.2.3. do while“直到”型循环.......................................................................................65
6.2.4. for“列表”型循环................................................................................................68
6.2.5. 循环小结................................................................................................................69
6.2.6. 循环的嵌套............................................................................................................70
6.2.7. 循环建议................................................................................................................72
6.2.8. 练习........................................................................................................................73
6.3. 跳转...................................................................................................................................75
6.3.1. break........................................................................................................................75
6.3.2. continue.................................................................................................................. 76
6.3.3. return.......................................................................................................................77
6.3.4. goto......................................................................................................................... 78
6.3.5. 练习........................................................................................................................78
6.4. 练习...................................................................................................................................78
6.4.1. 打印如下图形........................................................................................................78
7. 数组(Array)...................................................................................................................................80
7.1. 一维数组...........................................................................................................................80
7.1.1. 逻辑与声明............................................................................................................80
7.1.2. 初始化....................................................................................................................81
7.1.3. 一维数组的存储....................................................................................................83
7.1.4. 数组三要素............................................................................................................84
7.1.5. 关于变长数组........................................................................................................84
7.1.6. 课堂练习................................................................................................................85
7.2. 二维数组...........................................................................................................................89
7.2.1. 逻辑与声明............................................................................................................89
7.2.2. 二维数组的存储....................................................................................................89
7.2.3. 初始化....................................................................................................................92
7.2.4. 课堂练习................................................................................................................94
7.3. 数组名的二义性...............................................................................................................97
7.3.1. 一维数组名............................................................................................................97
7.3.2. 二维数组名............................................................................................................98
5
原创作者: 王桂林
技术交流:QQ 329973169
7.4. 练习...................................................................................................................................99
7.4.1. 写出冒泡排序的逻辑,并实现冒泡排序。....................................................... 99
7.4.2. 无序数组查找,返回下标(线性查找).............................................................. 99
7.4.3. 有序数组查找(折半查找)............................................................................... 99
7.4.4. 合并两个有序数组到第三个中去,并使其依然保持有序...............................99
7.4.5. 求出矩阵两条对角线上的元素之和................................................................. 100
7.4.6. 有序数组去重,并返回去重后数组元素新个数。.........................................100
7.4.7. 二维数组按列移位............................................................................................. 100
7.4.8. 五子棋判输赢......................................................................................................100
8. 指针(Pointer)..............................................................................................................................101
8.1. 认识内存.........................................................................................................................101
8.1.1. 线性的内存..........................................................................................................101
8.1.2. 变量的地址与大小............................................................................................. 102
8.1.3. 间接访问内存......................................................................................................103
8.2. 指针常量.........................................................................................................................103
8.2.1. 指针是有类型地址常量..................................................................................... 103
8.3. 指针变量.........................................................................................................................105
8.3.1. 定义......................................................................................................................105
8.3.2. 解析......................................................................................................................105
8.3.3. 指针变量大小......................................................................................................105
8.3.4. 初始化及间接访问............................................................................................. 106
8.3.5. 指向/被指向/更改指向...................................................................................... 106
8.3.6. NULL(色即空).................................................................................................. 108
8.3.7. 练习......................................................................................................................108
8.4. 指针运算.........................................................................................................................109
8.4.1. 赋值运算..............................................................................................................109
8.4.2. 算术运算..............................................................................................................109
8.4.3. 关系运算..............................................................................................................110
8.4.4. 小结......................................................................................................................110
8.5. 数组遇上指针.................................................................................................................111
8.5.1. 一维数组的访问方式......................................................................................... 111
8.5.2. 二维数组的访问方式......................................................................................... 113
8.6. 练习.................................................................................................................................116
8.6.1. 用指针法逆序打印一个数组。......................................................................... 116
8.6.2. 往指定内存写入数据......................................................................................... 116
8.6.3. 判判是否是回文串............................................................................................. 116
9. 函数(Function)........................................................................................................................... 117
9.1. c 标准库及库函数...........................................................................................................117
9.1.1. 库存在的意义......................................................................................................117
9.1.2. 如何使用库函数................................................................................................. 117
9.1.3. 示例......................................................................................................................118
9.1.4. 常用库函数..........................................................................................................123
9.2. 自定义函数.....................................................................................................................124
9.2.1. 语法格式..............................................................................................................124
6
原创作者: 王桂林
技术交流:QQ 329973169
9.2.2. 调用方法..............................................................................................................125
9.2.3. 前向声明..............................................................................................................125
9.2.4. 函数返回值..........................................................................................................126
9.3. 传值与传址.....................................................................................................................126
9.3.1. 传值与传址的比较............................................................................................. 126
9.3.2. 图解传值与传址................................................................................................. 128
9.3.3. 如何来传递一个一维数组................................................................................. 129
9.3.4. 如何来传递一个二维数组................................................................................. 131
9.3.5. 小结......................................................................................................................131
9.4. 函数调用.........................................................................................................................131
9.4.1. 实参与形参..........................................................................................................131
9.4.2. 普通调用..............................................................................................................131
9.4.3. 递归调用..............................................................................................................132
9.5. 函数递归.........................................................................................................................133
9.5.1. 递归定义..............................................................................................................133
9.5.2. 递归小结..............................................................................................................135
9.5.3. 递归与循环论述................................................................................................. 135
9.5.4. 递归练习..............................................................................................................137
9.6. 练习.................................................................................................................................137
9.6.1. 如何产生[m,n]以内的随机数。........................................................................ 137
9.6.2. 产生 30 个不重复的随机数............................................................................... 137
9.6.3. 请用函数封装基于数组的冒泡排序,选择排序。.........................................137
9.6.4. 用函数的思想来支解选择法排序..................................................................... 137
9.6.5. 请用函数封装基于数组的二分查找。............................................................. 138
9.6.6. 求中位数..............................................................................................................138
10. 变量作用域/生命周期/修饰符.............................................................................................. 139
10.1. 作用域(Scope).............................................................................................................. 139
10.1.1. 作用域................................................................................................................139
10.1.2. 变量之分............................................................................................................139
10.1.3. 图示作用域....................................................................................................... 140
10.1.4. 作用域叠加....................................................................................................... 140
10.1.5. 全局作用域....................................................................................................... 141
10.2. 生命周期(Duration)......................................................................................................142
10.2.1. 局部变量............................................................................................................142
10.2.2. 全局变量............................................................................................................142
10.3. 修饰符(Storage Description )....................................................................................... 142
10.3.1. auto(大将军).......................................................................................................142
10.3.2. register(小太监)..................................................................................................142
10.3.3. extern(通关文牒)................................................................................................143
10.3.4. static(柱国老臣|限离出境)............................................................................... 145
10.4. 小结...............................................................................................................................147
11. 字符串(String)..........................................................................................................................148
11.1. 引入...............................................................................................................................148
11.2. 字符串常量...................................................................................................................148
7
原创作者: 王桂林
技术交流:QQ 329973169
11.2.1. 字符串大小....................................................................................................... 149
11.2.2. 字符串存储....................................................................................................... 149
11.2.3. C 语言是如何处理字符串常量......................................................................... 150
11.3. 字符串与字符数组.......................................................................................................150
11.3.1. 常量字符串不可更改....................................................................................... 150
11.3.2. 字符串与字符数组比较................................................................................... 150
11.3.3. 字符数组存储字符串....................................................................................... 151
11.3.4. 小结....................................................................................................................152
11.4. 字符串的输入与输出.................................................................................................. 153
11.4.1. 输出....................................................................................................................153
11.4.2. 输入....................................................................................................................153
11.5. 字符串操作函数...........................................................................................................154
11.5.1. 字符数组原生操作........................................................................................... 154
11.5.2. 库函数操作....................................................................................................... 155
11.6. 字符串操作函数自实现.............................................................................................. 158
11.6.1. myStrlen.............................................................................................................. 158
11.6.2. myStrcpy..............................................................................................................159
11.7. 多文件编程...................................................................................................................160
11.7.1. 函数声明(.h)......................................................................................................160
11.7.2. 函数实现(.c)...................................................................................................... 160
11.7.3. 头文件包含#include..........................................................................................161
11.8. 指针数组.......................................................................................................................161
11.8.1. 定义....................................................................................................................161
11.8.2. 应用....................................................................................................................162
11.8.3. 思考....................................................................................................................164
11.9. 你所追过的那些“零”.............................................................................................. 164
11.9.1. 零所代表的意义............................................................................................... 164
11.9.2. 实例分析............................................................................................................164
11.10. 作业.............................................................................................................................165
11.10.1. 自实现 myStrcat............................................................................................. 165
11.10.2. 自实现 myStrcmp............................................................................................165
11.10.3. 以下代码能打印什么?................................................................................. 166
12. 内存管理(Memory)................................................................................................................. 167
12.1. 进程空间.......................................................................................................................167
12.1.1. 进程 vs 程序...................................................................................................... 167
12.1.2. 进程空间图....................................................................................................... 167
12.2. 栈内存(Stack)................................................................................................................167
12.2.1. 栈存储的内容................................................................................................... 167
12.2.2. 栈存储的特点................................................................................................... 168
12.2.3. 栈大小................................................................................................................168
12.2.4. 常见栈溢出案例............................................................................................... 168
12.3. 堆内存(Heap)................................................................................................................169
12.3.1. 堆内存特点....................................................................................................... 169
12.3.2. 堆大小................................................................................................................169
8