原创作者: 王桂林
技术交流:QQ 329973169
C 语言进阶篇
人生除了眼前的苟且,还有 C++和远方。
Author:王桂林
Mail
Org
:
: 广州小码哥教育
guilin_wang@163.com
1
原创作者: 王桂林
技术交流:QQ 329973169
版本信息:
版本
V1.0
修订人
王桂林
审阅人
时间
组织
2016.04.02
广州小码哥教育科技有限公司
1
原创作者: 王桂林
技术交流:QQ 329973169
1. 数据类型........................................................................................................................................8
1.1. 内存.................................................................................................................................... 8
1.2. 补码.................................................................................................................................... 8
1.2.1. 运算规则..................................................................................................................8
1.2.2. 补码特点..................................................................................................................8
1.2.3. char(8 位)补码的展示..............................................................................................9
1.3. 数据类型............................................................................................................................ 9
1.3.1. 数据类型..................................................................................................................9
1.3.2. 范围计算..................................................................................................................9
1.3.3. 为什么需要类型....................................................................................................10
1.4. 类型转化.......................................................................................................................... 11
1.4.1. 类型转化的原理....................................................................................................11
1.4.2. 隐式转化................................................................................................................12
1.4.3. 显示(强制类型)转化.............................................................................................12
1.5. 练习.................................................................................................................................. 12
1.5.1. 下面的代码输出什么?....................................................................................... 12
1.5.2. 以下程序输出什么?........................................................................................... 13
2. 进程空间......................................................................................................................................14
2.1. 进程空间.......................................................................................................................... 14
2.2. 进程/程序.........................................................................................................................14
2.2.1. 程序........................................................................................................................14
2.2.2. 进程........................................................................................................................14
2.2.3. 进程到程序............................................................................................................14
2.3. 数据在进程空间的存储.................................................................................................. 15
2.3.1. 示意图....................................................................................................................15
2.3.2. 数据在进程空间....................................................................................................16
2.4. 函数的压栈与出栈.......................................................................................................... 17
2.4.1. 普通函数................................................................................................................17
2.4.2. 递归函数................................................................................................................17
2.5. 练习.................................................................................................................................. 18
3. 数组..............................................................................................................................................19
3.1. 一维数组.......................................................................................................................... 19
3.1.1. 本质........................................................................................................................19
3.1.2. 初始化....................................................................................................................19
3.1.3. 访问........................................................................................................................19
3.1.4. 作参数传递............................................................................................................20
3.1.5. 返回堆中一维数组............................................................................................... 21
3.1.6. 练习........................................................................................................................22
3.2. 二维数组.......................................................................................................................... 24
3.2.1. 本质........................................................................................................................24
3.2.2. 初始化....................................................................................................................25
3.2.3. 访问........................................................................................................................25
3.2.4. 线性存储................................................................................................................27
1
原创作者: 王桂林
技术交流:QQ 329973169
3.2.5. 作参数传递............................................................................................................27
3.3. 数组指针.......................................................................................................................... 28
3.3.1. 对一维数组名的误解及纠正............................................................................... 28
3.3.2. 数组指针................................................................................................................28
3.3.3. 应用........................................................................................................................28
3.4. 多维数组.......................................................................................................................... 29
3.4.1. 本质分析................................................................................................................29
3.4.2. 形像描述................................................................................................................29
3.5. 练习.................................................................................................................................. 29
3.5.1. 求值?......................................................................................................................29
3.5.2. 下面代码的值为多少?....................................................................................... 30
4. 指针..............................................................................................................................................31
4.1. 内存编址与变量地址...................................................................................................... 31
4.1.1. 编址........................................................................................................................31
4.1.2. 变量地址................................................................................................................31
4.2. 指针与指针变量.............................................................................................................. 32
4.2.1. 指针的本质............................................................................................................32
4.2.2. 指针变量................................................................................................................32
4.3. 二级指针.......................................................................................................................... 34
4.3.1. 定义与初始化........................................................................................................34
4.3.2. 间接数据访问........................................................................................................35
4.3.3. 初始化一级指针....................................................................................................36
4.3.4. 二级指针的步长....................................................................................................37
4.4. 指针数组(字符指针数组)................................................................................................38
4.4.1. 定义........................................................................................................................38
4.4.2. 使用........................................................................................................................38
4.4.3. 二级指针访问指针数组....................................................................................... 39
4.4.4. 常见指针数组........................................................................................................39
4.5. 指针的输入与输出.......................................................................................................... 40
4.6. 堆上一维空间.................................................................................................................. 41
4.7. 堆上二维空间.................................................................................................................. 41
4.7.1. 一级指针作返值输出........................................................................................... 41
4.7.2. 二级指针作返值输出........................................................................................... 42
4.7.3. 三级指针作参数输出........................................................................................... 43
4.7.4. 课堂练习................................................................................................................43
4.8. const...................................................................................................................................46
4.8.1. const 修饰变量......................................................................................................46
4.8.2. const 修饰指针......................................................................................................47
4.8.3. const 修饰指针指向..............................................................................................47
4.8.4. 应用(修饰函数参数).............................................................................................48
4.9. 练习.................................................................................................................................. 48
4.9.1. 请手写下面代码的输出结果。........................................................................... 48
4.9.2. 下面的代码输出什么?..........................................................................................49
4.9.3. 天生棋局................................................................................................................49
2
原创作者: 王桂林
技术交流:QQ 329973169
5.4.1. (*(void(*) ()) 0)();
5. 函数..............................................................................................................................................50
5.1. 多参返回.......................................................................................................................... 50
5.1.1. 引列........................................................................................................................50
5.1.2. 正解........................................................................................................................50
5.2. 函数指针.......................................................................................................................... 50
5.2.1. 函数的本质............................................................................................................50
5.2.2. 函数指针变量定义与赋值................................................................................... 50
5.2.3. 函数指针类型定义............................................................................................... 51
5.2.4. 函数指针调用........................................................................................................51
5.2.5. 函数指针数组........................................................................................................51
5.3. 回调函数.......................................................................................................................... 53
5.3.1. 问题引出................................................................................................................53
5.3.2. 回调(函数作参数)................................................................................................. 54
5.3.3. 本质论....................................................................................................................54
5.3.4. qsort........................................................................................................................ 55
5.4. 练习.................................................................................................................................. 58
------这是什么?..................................................................... 58
6. 再论指针与数组..........................................................................................................................59
6.1. 一级指针与一维数组名.................................................................................................. 59
6.1.1. 等价条件................................................................................................................59
6.1.2. 便利访问................................................................................................................59
6.2. 二级指针与指针数组名.................................................................................................. 59
6.2.1. 等价条件................................................................................................................59
6.2.2. 便利访问................................................................................................................59
6.2.3. 通过二级指针申请二维空间............................................................................... 59
6.3. 数组指针与二维数组名.................................................................................................. 59
6.3.1. 等价条件................................................................................................................59
6.3.2. 便利访问................................................................................................................59
6.4. 关于二级指针与二维数组名.......................................................................................... 59
6.5. 对数组名的引用.............................................................................................................. 59
6.5.1. 一维数组................................................................................................................59
6.5.2. 二维数组................................................................................................................60
6.6. 小结与练习...................................................................................................................... 60
6.6.1. 指针-数组-函数..................................................................................................... 60
6.6.2. 请写出右边的示意............................................................................................... 60
6.6.3. 传参汇总................................................................................................................60
7. 基于数组排序(提高篇)............................................................................................................... 62
7.1. 选择优化.......................................................................................................................... 62
7.1.1. 选择原理与步骤....................................................................................................62
7.1.2. 代码实现................................................................................................................62
7.1.3. 优化升级................................................................................................................62
7.2. 冒泡优化.......................................................................................................................... 63
7.2.1. 冒泡原理与步骤....................................................................................................63
7.2.2. 代码实现................................................................................................................63
3
原创作者: 王桂林
技术交流:QQ 329973169
7.2.3. 优化升级................................................................................................................63
7.3. 快速排序.......................................................................................................................... 64
7.3.1. 排序原理与步骤....................................................................................................64
7.3.2. 代码实现................................................................................................................64
7.4. 练习.................................................................................................................................. 64
7.4.1. 实现二级排序........................................................................................................64
8. 基于数组的查找..........................................................................................................................66
8.1. 线性查找.......................................................................................................................... 66
8.2. 二分查找.......................................................................................................................... 66
8.2.1. 原理步骤................................................................................................................66
8.2.2. 迭代版....................................................................................................................66
8.2.3. 递归版....................................................................................................................66
9. 字符串..........................................................................................................................................68
9.1. 字符串常量...................................................................................................................... 68
9.1.1. 定义相关................................................................................................................68
9.1.2. c 语言处理字符串..................................................................................................68
9.2. 字符数组.......................................................................................................................... 68
9.2.1. 字符数组与字符串............................................................................................... 68
9.2.2. 不等价条件............................................................................................................69
9.2.3. 等价条件................................................................................................................69
9.2.4. N 系列字符串函数.................................................................................................69
9.3. 字符串操作函数.............................................................................................................. 70
9.3.1. strlen........................................................................................................................70
9.3.2. strcpy/strncpy......................................................................................................... 70
9.3.3. strcat/strncat...........................................................................................................71
9.3.4. strcmp/strncmp.......................................................................................................71
9.3.5. sprintf...................................................................................................................... 71
9.3.6. atoi/itoa...................................................................................................................72
9.3.7. strchr....................................................................................................................... 73
9.3.8. strstr........................................................................................................................ 74
9.3.9. strtok....................................................................................................................... 76
9.4. 内存操作函数.................................................................................................................. 79
9.4.1. memcpy...................................................................................................................79
9.4.2. memmove............................................................................................................... 80
9.4.3. memcmp................................................................................................................. 80
9.4.4. memchr................................................................................................................... 80
9.4.5. memset....................................................................................................................80
9.5. 字符串应用案例.............................................................................................................. 81
9.5.1. trim 系列.................................................................................................................81
9.5.2. 递归逆置字符串....................................................................................................82
9.6. 练习.................................................................................................................................. 84
9.6.1. 返回 s2 在 s1 中最后一次出现的位置................................................................84
9.6.2. 清空字符串中的制表符....................................................................................... 84
9.6.3. 格式化文件............................................................................................................84
4
原创作者: 王桂林
技术交流:QQ 329973169
9.6.4. 判断字符串 s1 是否是 s2 循环移位所得............................................................84
9.6.5. 求字符频度............................................................................................................84
9.6.6. 压缩字符串............................................................................................................84
9.6.7. 实现 atoi 功能....................................................................................................... 84
9.6.8. 实现 itoa 功能....................................................................................................... 85
10. 数据结构(双向循环链表)......................................................................................................... 86
10.1. 双向循环链表存在的意义............................................................................................86
10.2. 链表构成........................................................................................................................ 86
10.2.1. 节点图示..............................................................................................................86
10.2.2. 节点码示..............................................................................................................86
10.2.3. 空链表示意..........................................................................................................87
10.2.4. 非空链表示意......................................................................................................87
10.3. 双向循环链表静态形式................................................................................................87
10.3.1. 节点代码..............................................................................................................87
10.3.2. 静态模拟..............................................................................................................87
10.4. 双向循环链表的操作....................................................................................................87
10.4.1. 创建......................................................................................................................87
10.4.2. 插入......................................................................................................................89
10.4.3. 遍历......................................................................................................................89
10.4.4. 求长度..................................................................................................................90
10.4.5. 查找......................................................................................................................90
10.4.6. 删除节点..............................................................................................................91
10.4.7. 排序......................................................................................................................91
10.4.8. 销毁......................................................................................................................92
10.5. 练习................................................................................................................................ 93
10.5.1. 用双向循环链表实现读文件到内存................................................................. 93
11. 动态库与静态库........................................................................................................................94
11.1. 函数库............................................................................................................................ 94
11.1.1. 库存在的意义......................................................................................................94
11.1.2. 库的划分..............................................................................................................94
11.1.3. 库的命名规则......................................................................................................94
11.1.4. 静/动态库特点....................................................................................................94
11.1.5. linux 库存放的路径..............................................................................................95
11.1.6. 使用特点..............................................................................................................95
11.1.7. 查看一个文件的库的使用情况......................................................................... 95
11.2. 标准库的使用................................................................................................................96
11.2.1. libm.a.....................................................................................................................96
11.2.2. lib.so...................................................................................................................... 96
11.2.3. 比较......................................................................................................................97
11.3. 自定义库的生成与使用................................................................................................98
11.3.1. 多文件编程..........................................................................................................98
11.3.2. 静态库的生成与使用....................................................................................... 100
11.3.3. 动态库的生成与使用....................................................................................... 100
11.4. gcc 的编译选项.............................................................................................................101
5
原创作者: 王桂林
技术交流:QQ 329973169
12. 配置文件读写..........................................................................................................................103
12.1. 文件回顾......................................................................................................................104
12.1.1. 文件基础............................................................................................................104
12.1.2. 文件操作............................................................................................................104
12.2. 链表回顾......................................................................................................................104
12.2.1. 节点....................................................................................................................104
12.2.2. 创建....................................................................................................................104
12.2.3. 插入....................................................................................................................104
12.2.4. 求长....................................................................................................................104
12.2.5. 查找....................................................................................................................104
12.2.6. 删除....................................................................................................................104
12.2.7. 排序....................................................................................................................104
12.2.8. 销毁....................................................................................................................104
12.3. 字符串处理回顾..........................................................................................................104
12.3.1. 常规处理............................................................................................................104
12.3.2. 去空处理............................................................................................................104
12.4. 实现登录系统..............................................................................................................104
12.4.1. 链表节点设计................................................................................................... 104
12.4.2. 读文件并处理字符串....................................................................................... 105
12.4.3. 登录....................................................................................................................105
13. SQLite.........................................................................................................................................106
13.1. 官网与下载..................................................................................................................106
13.2. SQLite 管理操作........................................................................................................... 106
13.2.1. 进入 sqlite3 交互模式.......................................................................................106
13.2.2. 创建销毁表....................................................................................................... 108
13.2.3. 插入与查询....................................................................................................... 109
13.2.4. 排序....................................................................................................................110
13.2.5. 修改与删除记录............................................................................................... 110
13.3. Window+Qt+SQLite 配置..............................................................................................111
13.3.1. window 中 lib /dll 的关系................................................................................. 111
13.3.2. 生成 lib 文件......................................................................................................111
13.3.3. 建立三方库相关的文件夹............................................................................... 112
13.3.4. 配置当前工程的 pro 文件................................................................................112
13.3.5. 测试环境............................................................................................................113
13.4. C/C++操作 SQLite..........................................................................................................113
14. 附录..........................................................................................................................................116
14.1. ascii 码表.......................................................................................................................116
14.2. c 运算符优先级............................................................................................................ 117
14.3. SVN 配置与启动.......................................................................................................... 117
14.3.1. 官方下载地址................................................................................................... 117
14.3.2. 创建服务配置文件........................................................................................... 117
14.3.3. 配置配置文件................................................................................................... 118
14.3.4. 启动服务............................................................................................................118
14.3.5. 创建与删除服务............................................................................................... 118
6