目录
本书源码
扫盲篇计算机底层的世界
第1章计算机体系概述(60min)
1.1CPU原理
1.1.1CPU在计算机中的位置
1.1.2运算器和控制器
1.1.3CPU架构
1.2内存和总线
1.2.1内存和缓存
1.2.2CPU寄存器和总线
1.3指令集分类
1.3.1指令集的意义
1.3.2两种指令集的特点
1.4内存和I/O设备统一编址
1.4.1非总线型设备的形态
1.4.2I/O设备和驱动
第2章从汇编语言到C语言(60min)
2.1汇编语言和C语言简介
2.1.1第1代编程语言
2.1.2第2代编程语言
2.1.3汇编语言组成
2.2汇编操作的寄存器
2.2.1数据寄存器
2.2.2指令寄存器
2.2.3程序计数寄存器
2.2.4地址寄存器
2.2.5累加寄存器
2.2.6程序状态寄存器
2.3CPU的寻址方式
2.3.1立即寻址
2.3.2直接寻址
2.3.3间接寻址
2.4C语言简介
2.4.1C语言发展历史
2.4.2C语言的特点
2.4.3C语言的缺点
2.5C语言构成
2.5.1基本构成
2.5.2关键字
2.5.3程序结构
2.5.4函数
2.5.5开发环境
第3章Ubuntu18 x64 GCC开发环境搭建
3.1使用虚拟机安装Ubuntu18 x64
3.1.1Ubuntu简介
3.1.2什么是虚拟机
3.1.3安装VMware Workstation 17
3.1.4安装Ubuntu 18.4 x64
3.1.5设置共享目录
3.2Linux常用命令
3.2.1文件和目录
3.2.2用户及用户组管理命令
3.3vim编辑器使用
3.3.1使用vi新建并编辑文本文件
3.3.2文本的删除、撤销、复制和查找
3.4压缩和查找
3.4.1tar压缩解压命令
3.4.2文件及文件内容查找
3.5使用GCC编译一个C语言程序
3.5.1GCC发展历史
3.5.2GCC常用命令
3.5.3写出第1个C语言程序
上手篇初学C语言
第4章C语言概览(70min)
4.1C语言程序结构
4.1.1顺序结构
4.1.2分支结构
4.1.3循环结构
4.2变量、常量和声明
4.2.1变量
4.2.2常量
4.2.3C语言声明
4.3标准输入/输出
4.3.1标准输入scanf函数
4.3.2标准输出printf函数
4.4简单函数
4.4.1库函数
4.4.2形参和实参
4.4.3局部变量和全局变量
第5章运算符和表达式(37min)
5.1优先级和结合性
5.1.1优先级表
5.1.2左结合和右结合
5.1.3表达式的值
5.2表达式中的隐式规则
5.2.1整型提升
5.2.2隐式转换
第6章数组和字符串(122min)
6.1数据类型和长度
6.1.1数据类型
6.1.2不同平台的类型长度
6.2一维数组
6.2.1初识数组
6.2.2数组的定义和使用
6.3多维数组
6.3.1一维数组作为数组元素
6.3.2多维数组
6.4字符串
6.4.1定义一个字符串
6.4.2把字符串当成数组
6.5strlen、strcmp和strcpy函数
6.5.1strlen函数
6.5.2strcmp函数
6.5.3strcpy函数
6.6sizeof、memset和memcpy函数
6.6.1取长度运算符sizeof()
6.6.2memset函数
6.6.3memcpy函数
第7章数制转换和位操作(153min)
7.1二进制、十进制和十六进制之间的转换
7.1.1二进制和十六进制
7.1.2各种进制到十进制的转换
7.2位操作
7.2.1左移和右移操作的意义
7.2.2给指定位送1或者0
7.2.3指定位取反
7.3计算机中整数的表示
7.3.1负整数面临的困境
7.3.2用加法表示减法
7.3.3符号位的由来
第8章控制流(92min)
8.1switchcase、break和continue
8.1.1switchcase
8.1.2break语句
8.1.3continue语句
8.2goto语句和标号
8.2.1标号
8.2.2使用标号进行跳转
8.3while、dowhile和for
8.3.1while和dowhile语句
8.3.2for循环
8.4嵌套循环
8.4.1多重for循环
8.4.2多重while循环
8.5if和else if深入
8.5.1ifelse语句的联动
8.5.2上升沿下降沿检测
第9章程序调试(62min)
9.1给main函数传参
9.1.1main函数的参数
9.1.2*argv[]的本质
9.2常见的编译报错
9.2.1未定义错误
9.2.2头文件错误
9.2.3函数隐式声明警告
9.2.4未声明错误
9.3打印调试
9.3.1编译阶段打印
9.3.2使用goto处理出错
9.4main函数返回
9.4.1main函数是否特殊
9.4.2main函数为何需要返回
第10章简单排序算法(93min)
10.1冒泡排序
10.1.1冒泡排序基本思想
10.1.2冒泡排序实现逻辑
10.2选择排序
10.2.1选择排序基本思想
10.2.2选择排序实现逻辑
10.3插入排序
10.3.1插入排序基本思想
10.3.2插入排序实现逻辑
提高篇C代码在运行中
第11章构造类型和指针(109min)
11.1C语言结构体
11.2共用体和枚举
11.2.1共用体
11.2.2枚举
11.3指针类型
11.3.1什么是指针
11.3.2指针的定义和野指针
11.3.3指针的解引用
11.3.4指针类型和数据类型
11.4void空类型
11.4.1空类型的意义
11.4.2空类型的使用
11.5typedef重定义类型
11.5.1typedef重定义基本数据类型
11.5.2typedef重定义结构体类型
11.5.3typedef重定义函数指针类型
第12章C语言对内存的使用(154min)
12.1强制类型转换和大小端
12.1.1强制类型转换
12.1.2大端和小端格式
12.2结构体的对齐访问
12.2.1结构体中成员的偏移
12.2.2结构体为何要对齐访问
12.2.3在GCC中对齐访问的方法
12.3变量的作用域和生命周期
12.3.1变量的作用域
12.3.2变量的生命周期
12.4运算中的临时变量
12.4.1临时变量现象
12.4.2临时变量的内因
第13章指针初探(102min)
13.1数组和指针
13.1.1数组在内存中的存在
13.1.2数组下标本质
13.2指针越界访问
13.2.1指针越界读取
13.2.2指针越界写入
13.3指针类型的作用
13.3.1指针类型和解引用
13.3.2指针类型和内存读取
13.3.3指针类型和偏移量
13.4函数指针
13.4.1函数指针初探
13.4.2使用地址调用函数
第14章栈和堆(58min)
14.1变量的内存分配
14.1.1变量的地址
14.1.2函数参数的地址
14.1.3函数返回值的传递
14.2栈内存简介
14.2.1栈内存
14.2.2栈内存的注意事项
14.3堆内存
14.3.1堆内存的申请和释放
14.3.2堆内存和栈内存的区别
第15章函数深入(325min)
15.1函数在内存中的体现
15.1.1函数所在的内存
15.1.2函数运行时的问题
15.2函数的参数
15.2.1函数形参在内存中
15.2.2函数形参的编程误区
15.3函数的返回和递归
15.3.1函数的运行和返回原理
15.3.2函数返回类型和一般规则
15.3.3函数的递归调用
15.4递归函数的分析
15.4.1递归函数的参数
15.4.2单递归函数返回逻辑
15.4.3二次递归的分析
15.4.4二次递归函数分析总结
15.5递归实例之归并排序
15.5.1归并排序实现逻辑
15.5.2合并算法分析
15.5.3二次递归算法分析
第16章编译和链接(127min)
16.1程序的编译
16.1.1预处理
16.1.2编译和链接过程
16.2C程序在内存中的分布
16.2.1代码段和数据段
16.2.2栈和堆
16.2.3各个段的内存分布
16.3动态链接和静态链接
16.3.1库文件的意义
16.3.2静态库文件的制作和使用
16.3.3程序运行中加载动态库
16.3.4静态库和动态库对程序运行的意义
16.4编译调试方法
16.4.1反汇编
16.4.2格式转换
16.4.3手动链接
第17章状态机和多线程(135min)
17.1有限状态
17.1.1什么是有限状态机
17.1.2使用C语言编写一个简单状态机
17.1.3状态机解决了什么问题
17.2多线程简介
17.2.1进程和线程
17.2.2线程安全
17.2.3函数的可重入性
17.3多线程编程入门
17.3.1Linux常用多线程库
17.3.2多线程编程实战
17.4线程同步简介
17.4.1线程不同步问题
17.4.2互斥锁
17.4.3自旋锁
高级篇C代码在操作系统层
第18章C语言指针高级部分(113min)
18.1结构体指针
18.1.1结构体指针的定义和使用
18.1.2使用结构体指针作为函数参数
18.2二重指针
18.2.1char **argv或char *argv[]
18.2.2定义二重指针并使用
18.3指针数组和数组指针,函数指针和指针函数
18.3.1指针数组和数组指针
18.3.2函数指针和指针函数
18.4offsetof和container_of宏
18.4.1offsetof宏
18.4.2container_of宏
第19章C语言函数高级部分(152min)
19.1函数的输入型参数和输出型参数
19.1.1形参中的const关键字
19.1.2形参的输入/输出接口形式
19.2函数类型和函数指针类型
19.2.1函数指针和函数类型匹配
19.2.2函数指针和函数类型不匹配
19.3回调函数
19.3.1使用回调函数进行方法绑定
19.3.2回调函数注册
19.4函数的调用策略
19.4.1C语言函数调用的流程
19.4.2C语言函数效率
19.5再论可重入函数
19.5.1设计可重入函数
19.5.2可重入函数的设计规范
第20章C语言底层特性(395min)
20.1const和volatile修饰指针
20.1.1const *p和*const p
20.1.2volatile修饰
20.2指针和作为指针的数据
20.2.1再论指针
20.2.2设备寄存器的读写
20.2.3指定地址跳转
20.3二重指针在底层
20.3.1字符串指针集合
20.3.2异常/中断向量表
20.4函数指针在底层
20.4.1函数指针数组在底层
20.4.2结构体包含函数指针
20.5论函数地址
20.5.1链接地址和运行地址
20.5.2位置有关码和位置无关码
20.6attribute关键字
20.6.1段声明
20.6.2对齐声明
20.6.3弱符号声明
20.6.4inline内联声明
第21章C语言链表(223min)
21.1单链表数据结构
21.1.1单链表的构成
21.1.2单链表节点创建
21.2单链表的操作
21.2.1单链表的尾插
21.2.2单链表的头插
21.2.3单链表的遍历
21.2.4单链表节点的删除
21.2.5单链表的逆序
21.3双链表数据结构
21.3.1双链表的构成
21.3.2双链表节点创建
21.4双链表的操作
21.4.1双链表的尾插
21.4.2双链表的头插
21.4.3双链表的遍历
21.4.4双链表节点的删除
21.4.5双链表的逆序
21.5循环链表浅析
21.5.1循环单链表的数据结构
21.5.2循环单链表的建立和遍历
21.5.3循环双链表的数据结构
21.5.4循环双链表的建立和遍历
第22章二叉树和哈希表(294min)
22.1二叉树简介
22.1.1树的概念及结构
22.1.2二叉树
22.2二叉树的实现
22.2.1二叉树节点创建
22.2.2二叉树的创建
22.3二叉树的遍历
22.3.1先序遍历
22.3.2中序遍历
22.3.3后序遍历
22.3.4层序遍历
22.4哈希表简介
22.4.1哈希表基本概念
22.4.2哈希冲突的解决
22.5实现简单的哈希表
22.5.1开放定址法
22.5.2链地址法
实战篇C语言在职场
第23章嵌入式软件开发
23.1单片机和嵌入式软件开发
23.1.1单片机开发岗
23.1.2嵌入式Linux开发岗
23.2嵌入式操作系统简介
23.2.1单片机操作系统
23.2.2嵌入式操作系统
23.3职业方向
23.3.1应用层开发
23.3.2驱动层开发
23.3.3物联网开发简介
第24章编译管理方法(143min)
24.1C代码的头文件
24.1.1头文件的意义
24.1.2头文件的一般规则
24.2多个C代码文件编译
24.2.1多个C文件编译体系
24.2.2多文件编译的管理问题
24.2.3使用脚本管理工程
24.3代码的层次管理
24.3.1H文件和C文件的分离
24.3.2代码的分层管理脚本
24.4开始写Makefile
24.4.1写一个最简单的Makefile
24.4.2Makefile最小系统
24.5Makefile进阶
24.5.1Makefile的变量和自动推导
24.5.2Makefile实践
参考文献