文章目录
- 一、结构体的自引用
- 1.结构体内不能包含同类型的结构体变量
- 2.使用结构体指针来实现自引用
- 3.有 typedef 的自引用
- 二、结构体嵌套初始化
- 1.结构体嵌套
- 2.结构体嵌套初始化
- 三、两个结构体互相包含
一、结构体的自引用
1.结构体内不能包含同类型的结构体变量
//错误写法struct Student{char name[20];struct Student s1;};
这种写法是非法的,原因是,结构体内的成员 s1 是另一个结构体,它的类型是 struct Student,但这个类型又包含同类型的结构体变量,这样就会一直重复下去
2.使用结构体指针来实现自引用
//结构体自引用的正确写法struct Student{char name[20];struct Student* next;//结构体指针,指向另一个结构体;指针的长度是确定的};
3.有 typedef 的自引用
typedef 重命名后的别名在结构体里面不能直接用
/* 正确写法 */typedef struct Student{char name[20];struct Student* next;}Stu;/* 错误写法 */typedef struct Student{char name[20];Stu* next;}Stu;
同时要注意匿名定义结构体类型时自引用是不可行的
//自引用不可行typedef struct{char name[20];Stu* next;}Stu;
原因是创建成员 next(类型为Stu的结构体变量)时,结构体类型 Stu 尚未被定义
二、结构体嵌套初始化
1.结构体嵌套
struct Student{char name[20];int age;};struct teacher{char name[20];struct Student s1;int age;};
2.结构体嵌套初始化
struct Student{char name[20];int age;};struct teacher{char name[20];struct Student st;//教师结构体包含学生结构体int age;};int main(){//初始化struct teacher t1 = { "teacher_Jack",{"Student_Pit",20},30 };//访问printf("%s %s %d %d\n", t1.name, t1.s1.name, t1.s1.age, t1.age);return 0;};
三、两个结构体互相包含
如果两个结构体互相包含,则需要对其中一个结构体进行不完整声明
struct B;//对结构体B进行不完整声明 //结构体A中包含指向结构体B的指针struct A{struct B *pb;//other members;}; //结构体B中包含指向结构体A的指针,在A声明完后,B也随之进行声明struct B{struct A *pa;//other members;};