天天看点

结构体知识梳理3-结构体包含结构体

基本使用

结构体的成员可以是任何已知类型,那么当然也可以是结构体类型:

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内存图如下

结构体知识梳理3-结构体包含结构体

多层结构体的成员的访问只需要一层一层找下来就可以了,普通变量用' .',指针变量或地址用->。

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;
           
结构体知识梳理3-结构体包含结构体
s_stu stu1; //假设地址0x30
s_stu stu2; //假设地址0x20
stu1.num = 1;
stu1.age = 1;
stu1.p = &stu2;
           

以上代码所画内存图如下 

结构体知识梳理3-结构体包含结构体