一.
在计算机中,位(bit)是表示和存储信息的最小单位,1B=8bit。C语言提供一种在位一级进行操作的机制。它允许在一个结构体中以位为单位来指定其成员所占内存的长度,这种以位为单位的成员称为“位段”,或“位域”。例如:
struct a
{
unsigned aa: 1;
unsigned bb: 1;
unsigned cc: 1;
}s;
这个结构体类型与前面的结构体类型的不同之处在于,结构体成员的长度以位为单位,需要在声明结构体类型时指定各位段的长度。具体方法是:在位段名的后面有一个冒号,莫阿豪的后面是所指定的位数。
二.
struct a
{
unsigned int aa: 3;
unsigned int bb: 1;
unsigned int cc: 1;
}x;
需要说明的是,在上面结构体中类型声明符为unsigned,这里是unsigned int,二者是等价的,int可以省略。不要误以为位段a是一个整型变量,占16位。unisgned int的意思是开辟一个整型数据空间,然后从其中分配给位段aa3个二进制位。接着,从其中分配4个字节给位段bb。如果各位段的长度超过一个整型数据的空间,即下一个位段已容纳不下,这时系统会自动开辟第二个整型数据的空间,从下一个整型数据空间开始存放下一个位段,即一个位段不能跨越2个整型空间。
也可以指定某一位段从一个整型数据空间的下一个字节开始存放,而不是紧接着前面的位段存放。
struct a
{
unsigned int aa: 3;
unsigned int: 0;
unsigned int bb: 1;
unsigned int: 0;
unsigned int cc: 1;
}x;
位段aa后面定义一个“位数为0”的无名位段,其作用是使下一个位段从另一字节开始存放。
三.
要注意每一个位段所能存储的最大值。这不是指定义位段时所占用的比特数,而是它们所能表示的最大数。例如x.aa占3bit,最大值为7,如果赋以值8就会出现溢出,从而使x.aa只能取8的二进制数的低3位(000)。
四.
不能引用位段的地址,因为地址是以字节为段位的,无法指定位。
五.
->优先级别最高。用圆点运算符“.”连接结构体变量与其成员;用->运算符连接指针变量与其所指结构体变量的成员。
六.
链表与数组相比,有以下不同点
1.组成数组的元素是顺序存放的,他们占有一片连续的存储空间。而链表元素——称为结点,不一定存放在一片连续的存储空间中,两个相邻结点在内存中也不一定相邻。
2.在链表中,前一个结点靠指针“指向”下一个结点,只有通过前一个结点才能找到下一个结点。要查找一个结点必须从头指针开始,逐个结点顺序查找。
七.
共用体数据类型是将不同的数据项存放于同一段内存空间的一种构造数据类型。
共用体类型与结构体类型的比较
1.存储结构不同
系统要为结构体变量的每个成员分配相应的存储空间,每个成员都有自己的空间;而系统对共用体变量存储空间的分配是按最大的一个成员所占用的存储空间进行分配的,所有成员共享这一空间。
2.由于结构体的每个成员都有自己的存储空间,所以所有成员可以同时存储;而共用体的所有成员共用一个存储空间,同一时间只能存储一个成员。
3.结构体变量可以在定义时进行初始化;而共用体变量不能在定义时进行初始化。也不能直接用共用体变量名进行输入或输出。
共用体变量的应用:
1.应用在数据处理上
struct
{
long num;
char name[20];
char sex;
char job;
union
{
int class;
char group[20];
}category;
};
如果job输入s(学生),则程序接着接收一个整数给class(班级号);如果job项值为“t”(教师),则接收一个字符串给group[20].
2.发现数据的底层存储形式
P276