结构体基础-结构体自引用
1.结构体的自引用
结构体内部的成员是否可以是该结构体本身。即结构体是否可以包含结构体本身?
答案:不可以
举例:
struct self_contain
{
char author[50];
float price;
struct self_contain mu;
};
这种类型的自引用是非法的,因为成员mu是另一个结构体,类型是struct self_contain它的内部还要包含自己的成员mu。
这个mu还将包括自己的成员mu,这样重复下去,永无止境。
像是一个永远不会终止的递归程序。
2. 结构体可以怎样被自引用
使用结构体指针
举例:
struct self_contain
{
char author[50];
float price;
struct self_contain* mu;
};
mu现在是一个结构体指针,指针的长度是确定的。
编译器在结构体的长度确定之前就已经知道了指针的长度,所以使用结构体指针的自引用是合法的。
结构体内部包含一个指向该结构体本身的指针,事实上,该指针所指向的是同一种类型的不同的结构体,链表和树就是使用这种技巧实现的。
3.结构体指针自引用的错误示例
这个错误示例与结构体初始化的方式有关,如果声明时省略结构体名(结构标签),使用结构体指针自引用也是不合法的!
举例:
typedef struct
{
char author[50];
float price;
SELF_CONTAIN* mu;
}SELF_CONTAIN;
使用typedef创建SELF_CONTAIN并且其结构成员可以自引用,但是上述示例在定义mu时,SELF_CONTAIN并没有创建,所以在结构体内部定义mu时,结构体类型并没有创建,所有不合法。
合法的方式:
typedef struct self_contain_tag
{
char author[50];
float price;
self_contain_tag* mu;
}SELF_CONTAIN;