结构体、枚举、联合体这三者都具有类似的结构,都是将一些变量或者值整合放在一起,这样做可以增加代码的可读性,也能方便编程。这篇博客中将会整理结构体、枚举、联合体的相关概念,举例介绍他们的适用场景。
目录
结构体
定义: 结构体是由一批数据组合而成的结构型数据。组成结构型数据的每个数据称为结构型数据的“成员”,其描述了一块内存区间的大小及解释意义。
结构体的声明
// 学生类型
struct Stu
{
char name[20];
short age;
char sex[5];
};
int main()
{
struct Stu s = {
"张三", 20, "男" };
return 0;
}
上面是最常规的定义方法,其中struct是结构体关键字,name、age、sex是结构体成员,s是结构体变量。通过这种方法我们就定义了struct Stu
这个数据类型,就跟基本数据类型char、int、float是一样的,为了方便使用,我们使用下面的定义方式:
typedef struct Stu
{
char name[20];
short age;
char sex[10];
}Stu; // 这样定义的话Stu就相当于struct Stu,后续定义对象的时候就可以省略掉struct
int main()
{
Stu s = {
"张三", 20, "男" };
printf("%s\n", s.name);
printf("%d\n", s.age);
printf("%s\n", s.sex);
return 0;
}
这样定义的话Stu就相当于struct Stu,后续定义对象的时候就可以省略掉struct。还有另一种定义方式:匿名定义。在声明结构的时候,可以不完全的声明。
// 匿名结构体类型
struct
{
int a;
char b;
float c;
}x;
因为匿名结构体没有类似于Stu的标识符,所以只能在声明的时候定义变量。
结构体初始化
// 结构体的声明和初始化
struct Point
{
int x;
int y;
}p1; //声明类型的同时定义变量p1,p1是一个全局变量
struct Node
{
int data;
struct Point p;
struct Node* next;
}n1 = {
10, {
4,5}, NULL }; //结构体嵌套初始化
void Test1()
{
p1.x = 3;
p1.y = 5;
printf("Test1: (%d, %d)\n", p1.x, p1.y);
}
void Test2()
{
struct Point p2; //定义结构体变量p2,未初始化,后续只能给结构体中的变量挨个赋值
p2.x = 4;
p2.y = 10;
printf("Test2: (%d, %d)\n", p2.x, p2.y);
}
void Test3()
{
struct Point p3 = {
3, 5 }; //初始化:定义变量的同时赋初值
printf("Test3: (%d, %d)\n", p3.x, p3.y);
}
void Test4()
{
struct Node n2 = {
20, {
5, 6}, NULL };//结构体嵌套初始化
printf("Test4: %d (%d, %d)", n2.data, n2.p.x