天天看點

結構體知識梳理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-結構體包含結構體