基本使用
结构体的成员可以是任何已知类型,那么当然也可以是结构体类型:
typedef struct student{
int num; //成员
int age;
char name[10];
}s_stu,*p_stu;
typedef struct team{
int num;
s_stu stu1;
p_stu pstu1; //注意这里是指针变量,占4个字节,存储地址而已
s_stu array[3];
}s_team,*p_team;
s_team内存图如下
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISNxATM0EzMwETOxYDM0EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
多层结构体的成员的访问只需要一层一层找下来就可以了,普通变量用' .',指针变量或地址用->。
s_team team1;
p_team p_team1 = &team1;
team1.pstu1 = &team.stu1;
team1.stu1.age = 1;
team1.pstu1->age = 1; //这里team1.pstu1->age能够操作的前提是 team1.pstu1已经存储team1.stu1的地址
team1.array[i].age = 1;
p_team1->pstu1 = p_team1.stu1;
p_team1->stu1.age = 1;
p_team1->pstu1->age = 1;
p_team1->array[i].age = 1;
成员前面用.还是用-> 只需要看上一层是否是指针。
注意事项
结构体的成员类型不能与自身相同
typedef struct student{
int num;
int age;
struct student stu1;
}s_stu,*p_stu;
我们可以反证如下:
如果以上代码存在,则要定义一个变量 s_stu stu,会为每一个成员分配内存,当分配到成员变量stu1的时候,又是一个s_stu 变量,这样的话就陷入死循环,导致代码崩溃。
结构体成员可以是自身类型的指针
typedef struct student{
int num;
int age;
struct student *p;//注意这里占4字节,存储地址,不要被*前面的struct student 所混淆
}s_stu,*p_stu;
s_stu stu1; //假设地址0x30
s_stu stu2; //假设地址0x20
stu1.num = 1;
stu1.age = 1;
stu1.p = &stu2;
以上代码所画内存图如下