很久之前在书上看过位段这个词,用在结构体中,我在实际编程中从来没用过。今天在做编程练习的时候定义结构体突然想到了位段,然后具体怎么用的实在是想不起来了,好奇心使我越来越坐不住了,然后我就翻开了之前看的书。废话不多说,本来写博客的目的就是为了让自己忘记的时候回来看一看。。。。。
对于什么是结构体我就不多说了,直接写我要记住的内容:
结构体的自引用
如何在一个结构体内部包含一个类型为该结构体本身的成员呢?先举个例子看看:
struct SELF_REF1{
int a;
struct SELF_REF1 b;
int c;
};
以上这种类型的自引用是非法的,因为成员b是另一个完整的结构体,其内部还将包含它自己的成员b。这第2个成员又是另一个完整的结构,它还将包含它自己的成员b。这样重复下去永无止境,就像是没有退出条件的递归。但是下边这个声明确是合法的:
struct SELF_REF1{
int a;
struct SELF_REF1 *b;
int c;
};
什么区别?就是多了一个星号(*),为什么这样就合法了?原因是b现在是一个指针,而不是一个结构体。其指针的长度在结构体确定之前就已经明确了,所以这种类型的自引用是合法的。
如果你觉得一个结构体内部包含一个指向该结构体本身的指针有些奇怪,请记住,它实际上所指的不是该结构体,而是同一类型的不同结构体。这种应用在链表和树中是最常用的。
注意:注意下边这个结构声明:
typedef struct {
int a;
struct SELF_REF1 *b;
int c;
}SELF_REF1;
这个声明的目的是为这个结构体创建类型名SELF_REF1。但是它失败了。类型名直到声明的末尾才定义,所以在结构声明的内部它尚未定义。
解决方案就是定义一个结构体标签来解决,如下所示:
typedef struct SELF_REF1_TAG{
int a;
struct SELF_REF1_TAG *b;
int c;
}SELF_REF1;
不完整的声明
偶尔,我们可能会声明一些相互之间有依赖关系的结构体。也就是说,其中的一个结构包含了另一个结构的一个或多个成员。和自引用结构一样,至少有一个结构必须在另一个结构内部以指针的形式存在。问题在于声明部分:如果每个结构都引用了其他结构的标签,那么,因果循环,总得有一个标签首先被声明,