原创作者: 王桂林
技术交流:QQ 329973169
C 语言高级进阶
你懂 c 语言,我不信。
Auth : 王桂林
Mail : guilin_wang@163.com
Org : 能众软件
Web
: http://edu.nzhsoft.cn
1
原创作者: 王桂林
技术交流:QQ 329973169
版本信息:
版本
V1.0
V1.1
修订人
王桂林
王桂林
审阅人
时间
组织
2016.04.02
2016.05.01
能众软件科技有限公司
更多学习:
1
原创作者: 王桂林
技术交流:QQ 329973169
2
原创作者: 王桂林
技术交流:QQ 329973169
1. 数据类型........................................................................................................................................1
1.1. 内存.....................................................................................................................................1
1.2. 补码.....................................................................................................................................1
1.2.1. 运算规则..................................................................................................................1
1.2.2. 补码特点..................................................................................................................1
1.2.3. char(8 位)补码的展示..............................................................................................2
1.3. 数据类型.............................................................................................................................2
1.3.1. 数据类型..................................................................................................................2
1.3.2. 范围计算..................................................................................................................2
1.3.3. 数据类型是对内存的格式化................................................................................. 3
1.4. 类型转化.............................................................................................................................5
1.4.1. 类型转化的原理......................................................................................................5
1.4.2. 隐式转化..................................................................................................................6
1.4.3. 显示(强制类型)转化...............................................................................................7
1.5. 练习.....................................................................................................................................7
1.5.1. 下面的代码输出什么?......................................................................................... 7
1.5.2. 以下程序输出什么?............................................................................................. 7
2. 进程空间........................................................................................................................................9
2.1. 进程空间.............................................................................................................................9
2.2. 进程/程序........................................................................................................................... 9
2.2.1. 程序..........................................................................................................................9
2.2.2. 进程..........................................................................................................................9
2.2.3. 进程到程序..............................................................................................................9
2.3. 数据在进程空间的存储...................................................................................................10
2.3.1. 示意图....................................................................................................................10
2.3.2. 数据在进程空间....................................................................................................11
2.4. 函数的压栈与出栈...........................................................................................................12
2.4.1. 普通函数................................................................................................................12
2.4.2. 递归函数................................................................................................................12
2.5. 课堂实战...........................................................................................................................13
2.5.1. 如下程序中数据存储在哪里............................................................................... 13
2.5.2. 用递归正/逆序打印一个数组..............................................................................14
3. 数组..............................................................................................................................................15
3.1. 一维数组...........................................................................................................................15
3.1.1. 本质........................................................................................................................15
3.1.2. 初始化....................................................................................................................15
3.1.3. 访问........................................................................................................................15
3.1.4. 作参数传递............................................................................................................17
3.1.5. 返回堆中一维数组............................................................................................... 17
3.1.6. 练习........................................................................................................................18
3.2. 二维数组...........................................................................................................................21
3.2.1. 本质........................................................................................................................21
3.2.2. 初始化....................................................................................................................21
1
原创作者: 王桂林
技术交流:QQ 329973169
3.2.3. 访问........................................................................................................................21
3.2.4. 线性存储................................................................................................................23
3.2.5. 作参数传递............................................................................................................24
3.3. 数组指针...........................................................................................................................24
3.3.1. 引入........................................................................................................................24
3.3.2. 定义........................................................................................................................24
3.3.3. 别名........................................................................................................................25
3.3.4. 数组指针与数组名............................................................................................... 25
3.3.5. 应用........................................................................................................................25
3.4. 多维数组...........................................................................................................................26
3.4.1. 本质分析................................................................................................................26
3.4.2. 形像描述................................................................................................................26
3.5. 课堂实战...........................................................................................................................26
3.5.1. 求值?......................................................................................................................26
3.5.2. 下面代码的值为多少?....................................................................................... 27
4. 指针..............................................................................................................................................28
4.1. 内存编址与变量地址.......................................................................................................28
4.1.1. 编址........................................................................................................................28
4.1.2. 变量地址................................................................................................................28
4.2. 指针与指针变量...............................................................................................................29
4.2.1. 指针的本质............................................................................................................29
4.2.2. 指针变量................................................................................................................29
4.2.3. 课堂实战................................................................................................................31
4.3. 二级指针...........................................................................................................................32
4.3.1. 定义与初始化........................................................................................................32
4.3.2. 间接数据访问........................................................................................................33
4.3.3. 初始化一级指针....................................................................................................34
4.3.4. 二级指针的步长....................................................................................................35
4.4. 指针数组(字符指针数组)................................................................................................ 36
4.4.1. 定义........................................................................................................................36
4.4.2. 使用........................................................................................................................36
4.4.3. 二级指针访问指针数组....................................................................................... 37
4.4.4. 常见指针数组........................................................................................................38
4.5. 指针的输入与输出...........................................................................................................39
4.6. 堆上一维空间...................................................................................................................39
4.6.1. 返回值返回(一级指针).........................................................................................39
4.6.2. 参数返回(二级指针).............................................................................................40
4.7. 堆上二维空间...................................................................................................................40
4.7.1. 一级指针作返值输出........................................................................................... 40
4.7.2. 二级指针作返值输出........................................................................................... 41
4.7.3. 三级指针作参数输出........................................................................................... 42
4.7.4. 课堂练习................................................................................................................42
4.8. const 修饰指针.................................................................................................................. 45
4.8.1. const 修饰变量......................................................................................................45
2
原创作者: 王桂林
技术交流:QQ 329973169
4.8.2. const 修饰符..........................................................................................................46
4.8.3. const 修饰指针指向..............................................................................................46
4.8.4. 应用(修饰函数参数).............................................................................................47
4.9. 练习...................................................................................................................................47
4.9.1. 请手写下面代码的输出结果。........................................................................... 47
4.9.2. 天生棋局................................................................................................................48
5. 函数..............................................................................................................................................49
5.1. 函数多参返回...................................................................................................................49
5.1.1. 引列........................................................................................................................49
5.1.2. 正解........................................................................................................................49
5.2. 函数指针...........................................................................................................................49
5.2.1. 函数的本质............................................................................................................49
5.2.2. 函数指针变量定义与赋值................................................................................... 49
5.2.3. 函数指针类型定义............................................................................................... 50
5.2.4. 函数类型别名........................................................................................................50
5.2.5. 函数指针调用........................................................................................................50
5.2.6. 函数指针数组........................................................................................................51
5.3. 回调函数...........................................................................................................................52
5.3.1. 问题引出................................................................................................................52
5.3.2. 回调(函数作参数)................................................................................................. 53
5.3.3. 本质论....................................................................................................................53
5.3.4. qsort........................................................................................................................ 54
5.4. 练习...................................................................................................................................57
5.4.1. (*(void(*) ()) 0)();.....................................................................................................57
6. 再论指针与数组..........................................................................................................................58
6.1. 一级指针与一维数组名...................................................................................................58
6.1.1. 等价条件................................................................................................................58
6.1.2. 便利访问................................................................................................................58
6.2. 二级指针与指针数组名...................................................................................................58
6.2.1. 等价条件................................................................................................................58
6.2.2. 便利访问................................................................................................................58
6.2.3. 通过二级指针申请二维空间............................................................................... 58
6.3. 数组指针与二维数组名...................................................................................................58
6.3.1. 等价条件................................................................................................................58
6.3.2. 便利访问................................................................................................................58
6.4. 关于二级指针与二维数组名.......................................................................................... 58
6.5. 对数组名的引用...............................................................................................................58
6.5.1. 一维数组................................................................................................................58
6.5.2. 二维数组................................................................................................................59
6.6. 小结与练习.......................................................................................................................59
6.6.1. 指针-数组-函数..................................................................................................... 59
6.6.2. 请写出右边的示意............................................................................................... 59
6.6.3. 传参汇总................................................................................................................59
6.6.4. 写出程序的运行结果........................................................................................... 60
3
原创作者: 王桂林
技术交流:QQ 329973169
7. 基于数组排序(提高篇)............................................................................................................... 61
7.1. 选择优化...........................................................................................................................61
7.1.1. 选择原理与步骤....................................................................................................61
7.1.2. 代码实现................................................................................................................61
7.1.3. 优化升级................................................................................................................61
7.2. 冒泡优化...........................................................................................................................62
7.2.1. 冒泡原理与步骤....................................................................................................62
7.2.2. 代码实现................................................................................................................62
7.2.3. 优化升级................................................................................................................62
7.3. 快速排序...........................................................................................................................63
7.3.1. 排序原理与步骤....................................................................................................63
7.3.2. 代码实现................................................................................................................63
7.4. 练习...................................................................................................................................63
7.4.1. 实现二级排序........................................................................................................63
8. 基于数组的查找..........................................................................................................................65
8.1. 线性查找...........................................................................................................................65
8.2. 二分查找...........................................................................................................................65
8.2.1. 原理步骤................................................................................................................65
8.2.2. 迭代版(Iterative)....................................................................................................65
8.2.3. 递归版(Recursive)..................................................................................................65
9. 字符串..........................................................................................................................................67
9.1. 字符串常量.......................................................................................................................67
9.1.1. 定义相关................................................................................................................67
9.1.2. c 语言处理字符串..................................................................................................67
9.2. 字符数组...........................................................................................................................67
9.2.1. 字符数组与字符串............................................................................................... 67
9.2.2. 不等价条件............................................................................................................68
9.2.3. 等价条件................................................................................................................68
9.2.4. N 系列字符串函数.................................................................................................68
9.3. 字符串操作函数...............................................................................................................69
9.3.1. strlen........................................................................................................................69
9.3.2. strcpy/strncpy......................................................................................................... 69
9.3.3. strcat/strncat...........................................................................................................70
9.3.4. strcmp/strncmp.......................................................................................................70
9.3.5. sprintf...................................................................................................................... 70
9.3.6. atoi/itoa...................................................................................................................71
9.3.7. strchr/strrchr...........................................................................................................72
9.3.8. strcspn/strspn..........................................................................................................73
9.3.9. strstr/strpbrk........................................................................................................... 73
9.3.10. strtok..................................................................................................................... 75
9.4. 内存操作函数...................................................................................................................78
9.4.1. memcpy...................................................................................................................78
9.4.2. memmove............................................................................................................... 79
9.4.3. memcmp................................................................................................................. 79
4
原创作者: 王桂林
技术交流:QQ 329973169
9.4.4. memchr................................................................................................................... 80
9.4.5. memset....................................................................................................................80
9.5. 字符串应用案例...............................................................................................................80
9.5.1. trim 系列.................................................................................................................80
9.5.2. 递归逆置字符串....................................................................................................81
9.6. 练习...................................................................................................................................83
9.6.1. 返回 s2 在 s1 中最后一次出现的位置................................................................83
9.6.2. 清空字符串中的制表符....................................................................................... 83
9.6.3. 格式化文件............................................................................................................83
9.6.4. 判断字符串 s1 是否是 s2 循环移位所得............................................................84
9.6.5. 求字符频度............................................................................................................84
9.6.6. 压缩字符串............................................................................................................84
9.6.7. 实现 atoi 功能....................................................................................................... 84
9.6.8. 实现 itoa 功能....................................................................................................... 84
10. 数据结构(双向循环链表)......................................................................................................... 85
10.1. 双向循环链表存在的意义............................................................................................ 85
10.2. 链表构成.........................................................................................................................85
10.2.1. 节点图示..............................................................................................................85
10.2.2. 节点码示..............................................................................................................85
10.2.3. 空链表示意..........................................................................................................86
10.2.4. 非空链表示意......................................................................................................86
10.3. 双向循环链表静态形式................................................................................................ 86
10.3.1. 节点代码..............................................................................................................86
10.3.2. 静态模拟..............................................................................................................86
10.4. 双向循环链表的操作.....................................................................................................86
10.4.1. 创建......................................................................................................................86
10.4.2. 插入......................................................................................................................88
10.4.3. 遍历......................................................................................................................88
10.4.4. 求长度..................................................................................................................89
10.4.5. 查找......................................................................................................................89
10.4.6. 删除节点..............................................................................................................90
10.4.7. 排序......................................................................................................................90
10.4.8. 销毁......................................................................................................................92
10.5. 链表应用-贪吃蛇........................................................................................................... 92
10.5.1. 业务逻辑..............................................................................................................92
10.5.2. MVC 架构分析......................................................................................................92
10.5.3. 其它......................................................................................................................92
10.6. 练习.................................................................................................................................92
10.6.1. 用双向循环链表实现读文件到内存................................................................. 92
11. 动态库与静态库........................................................................................................................93
11.1. 函数库.............................................................................................................................93
11.1.1. 库存在的意义......................................................................................................93
11.1.2. 库的划分..............................................................................................................93
11.1.3. 库的命名规则......................................................................................................93
5