C语言——结构体的自引用、结构体嵌套、结构体互相包含

文章详细介绍了结构体的自引用,包括为什么直接在结构体中包含同类型结构体是非法的,以及如何通过指针和typedef正确实现自引用。接着,讨论了结构体的嵌套初始化,展示了一个教师结构体包含学生结构体的例子。最后,提到了两个结构体互相包含的情况,需要对其中一个进行不完整声明来解决循环依赖问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、结构体的自引用

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;
};
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青春无限坑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值