基本使用
結構體的成員可以是任何已知類型,那麼當然也可以是結構體類型:
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;
以上代碼所畫記憶體圖如下