結構體知識梳理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內存圖如下


多層結構體的成員的訪問只需要一層一層找下來就可以了,普通變量用' .',指針變量或地址用->。

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;
以上代碼所畫內存圖如下 










發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章