1.结构体的声明
struct Stu { char name[20]; int age; int higt; }stu;
关键词+结构体名字
{
结构体成员;
}结构体变量名;
2.结构体的初始化
结构体的初始化有两种:
2.1按结构体成员顺序初始化
struct Stu { char name[20]; int age; int higt; }; int main() { struct Stu s1={ "xiaocheng",20,185}; return 0; }
2.2按指定的顺序初始化
struct Stu { char name[20]; int age; int higt; }; int main() { struct Stu s2={.age=20,.name="xiaocheng",.higt=185}; return 0; }
3.结合体的特殊声明
在声明结构体类型时候,可以不完全声明,也就是匿名结构体类型
struct { char name[20]; int age; int higt; }x;
上面的结构体声明中没有结构体标签,是匿名结构体。
下面有一个问题:
struct { char name[20]; int age; int higt; }x; struct Stu { char name[20]; int age; int higt; }*p; p=&x;
上面代码是不合法的,编译器会把上面两个结构体当成两种不同的类型,会出现警告。
匿名的结构体类型创建之后,如果不重新进行命名,基本上只能用一次。
4.结构体的自引用
我们学习了结构体的创建和初始化之后,那么如果想要做到结构体引用结构体,类似递归的操作,要怎么做呢?
看下面一段代码是否可行:
struct Stu { char name[20]; int age; int higt; struct Stu next; };
答案是不行的,上面代码中在结构中包含⼀个类型为该结构本身的成员,这样的话结构体的内存就会变的无穷大。
正确的自引用方式:
struct Stu { char name[20]; int age; int higt; struct Stu* next; };
如果对匿名的结构体进行自引用的话可不可以呢?
首先对匿名结构体进行自引用时要先给它重新命名,看下面一段代码:
typedef struct { char name[20]; int age; int higt; Stu* next; }Stu;
这样其实也是不行的,因为c语言是一种编译型代码,是一行一行的往下面执行的,在对匿名结构体重命名为Stu之前就已经进行自引用了,所以是不可行的。
正确的解决方案就是:自引用就不要使用匿名结构体了。