1、联合体与结构体
联合体
用途:使几个不同类型的变量共占一段内存(相互覆盖)。
联合表示几个变量公用一个内存位置, 在不同的时间保存不同的数据类型和不同长度的变量。
当一个联合被说明时, 编译程序自动地产生一个变量, 其长度为联合中最大 的变量长度。
共同体变量中起作用的成员是最后一次存放的成员,在存入新的成员后原有的成员失去了作用!
结构体是一种构造数据类型
用途:把不同类型的数据组合成一个整体-------自定义数据类型
结构体变量所占内存长度是各成员占的内存长度的总和。
不同成员赋值是互不影响的
1. 结构和联合都是由多个不同的数据类型成员组成, 但在任何同一时刻,
联合中只存放了一个被选中的成员, 而结构的所有成员都存在。
2. 对于联合的不同成员赋值, 将会对其它成员重写, 原来成员的值就不存
在了, 而对于结构的不同成员赋值是互不影响的。
2、含参数的宏与函数的优缺点
含参数的宏优点:省去了函数调用的开销,运行效率高。
缺点:由于宏本质上是字符串的替换,所以可能会由于一些参数的副作用导致错误的结果。另外,如果程序中有多次宏替换的话,可能导致代码体积变大。
函数的优点:没有带参数可能导致的副作用,计算的正确性较宏更有保证。
缺点:函数调用需要一些参数,返回地址等入栈,出栈的开销,效率没有宏高。
3、树的基本概念
树的递归定义:一棵树是N个节点和N-1条边的集合,其中的一个节点叫做根。
根:没有父节点的节点叫做根。
父亲
树叶
兄弟
路径:从节点n1到ni的路径定义为节点n1,n2,…ni的一个序列。这条路径的长,为该路径的边,即i-1。
深度:对节点ni的深度为从根节点到ni的路径长。
高度:对节点ni的高度为从节点ni到叶子节点最长的路径长。
一棵树的高度=一棵树的深度
4、森林和二叉树的转换
如果F={ T1,T2,....,Tm }是森林,则可按如下规则转换成一棵二叉树B=(root,LB,RB)
(1)若F为空,即m=0,则B为空树。
(2)若F非空,即m≠0,则B的根root即为森林中第一棵树的根ROOT(T1);
B的左子树LB是从T1中根结点的子树森林F1= { T11,T12,...,T1m1} 转换而成的二叉树
B的右子树RB是从森林F‘ = { T2,T3,.....,Tm}转换而来的二叉树。
5、二叉树转换成森林
如果B=(root,LB,RB)是一棵二叉树,则可按如下规则转换成森林F={ T1,T2,....,Tm }
(1)若B为空,则F为空。
(2)若B非空,则F中第一棵树T1的根root即为二叉树B的根root;
T1中根结点的子树森林F1是由B的左子树LB转换而成的森林;
F中除T1之外其余树组成的森林F‘ = { T2,T3,.....,Tm}是由B的右子树RB转换而成的森林。
6、二叉树转换成树
二叉树转换为树是树转换为二叉树的逆过程,其步骤是:
(1)若某结点的左孩子结点存在,将左孩子结点的右孩子结点、右孩子结点的右孩子结点……都作为该结点的孩子结点,将该结点与这些右孩子结点用线连接起来;
(2)删除原二叉树中所有结点与其右孩子结点的连线;
(3)整理(1)和(2)两步得到的树,使之结构层次分明。
7、树转换成二叉树
由于二叉树是有序的,为了避免混淆,对于无序树,我们约定树中的每个结点的孩子结点按从左到右的顺序进行编号。
将树转换成二叉树的步骤是:
(1)加线。就是在所有兄弟结点之间加一条连线;
(2)抹线。就是对树中的每个结点,只保留他与第一个孩子结点之间的连线,删除它与其它孩子结点之间的连线;
(3)旋转。就是以树的根结点为轴心,将整棵树顺时针旋转一定角度,使之结构层次分明。
8、计算机指令执行
计算机执行指令一般分为两个阶段。
第一阶段,将要执行的指令从内存取到CPU内。
第二阶段,CPU对取入的该条指令进行分析译码,判断该条指令要完成的操作。
然后向各部件发出完成该操作的控制信号,完成该指令的功能。
当一条指令执行完后就进入下一条指令的取指操作。
一般将第一阶段取指令的操作称为取指周期,将第二阶段称为执行周期。程序由一系列指令的有序集合构成,计算机按照程序设定的顺序完成一系列相关操作直到程序终止的过程叫做程序的执行过程。但是最初的电脑是是没有内存的,CPU处理的数据全部直接读取硬盘内的数据,所以程序可以不通过内存也可以运行。当程序或者操作者对CPU发出指令,这些指令和数据暂存在内存里,在CPU空闲时传送给CPU,cpu忙碌时内存等待cpu处理结束。CPU处理后把结果输出到输出设备上,内存虽然容量大,但是速度没有cpu速度快。数据也保存在内存里,如果内存不足,那么系统自动从硬盘上划分一部分空间作为虚拟内存来用。但写入和读取的速度跟物理内存差的很远很远,所以,在内存不足的时候,会感到机器反应很慢,硬盘一直在响。
9、在C++程序中调用被C编译器编译后的函数,为什么要加extern“C”?
C++语言支持函数重载,C语言不支持函数重载。函数被C++编译后在库中的名字与C语言不同。假设某个函数的原型为:void foo(int x, inty);
该函数被C编译器编译后在库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字。
C++提供了C连接交换符号extern”C”来解决名字匹配问题。
10、什么是预编译,何时需要预编译
预编译又称为预处理 , 是做些代码文本的替换工作。
处理以#开头的指令 , 比如拷贝#include包含的文件代码,#define 宏定义的替换,条件编译等,就是为编译做的预备工作的阶段。
主要处理#开始的预编译指令,预编译指令指示了在程序正式编译前就由编译器进行的操作,可以放在程序中的任何位置。
C 编译系统在对程序进行通常的编译之前,首先进行预处理。
c 提供的预处理功能主要有以下三种:
1 )宏定义
2 )文件包含
3 )条件编译
何时需要预编译:
总是使用不经常改动的大型代码体。
程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项。在这种情况下,可以将所有包含文件预编译为一个“预编译头”