图书目录

目录

本书源码

扫盲篇计算机底层的世界

第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.1switchcase、break和continue

8.1.1switchcase

8.1.2break语句

8.1.3continue语句

8.2goto语句和标号

8.2.1标号

8.2.2使用标号进行跳转

8.3while、dowhile和for

8.3.1while和dowhile语句

8.3.2for循环

8.4嵌套循环

8.4.1多重for循环

8.4.2多重while循环

8.5if和else if深入

8.5.1ifelse语句的联动

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实践

参考文献