📅  最后修改于: 2023-12-03 14:59:38.660000             🧑  作者: Mango
在C语言中,结构体是一种自定义的数据类型。它可以包含多个不同类型的成员变量,并且这些成员变量可以被同时访问和操作。
以下是定义一个结构体的一般格式:
struct 结构名{
类型 成员1;
类型 成员2;
// ...
};
结构体成员可以是任何数据类型,包括标量类型(如整数、浮点数等)和指针类型,甚至可以是其他结构体。
例如,以下是一个用于表示学生信息的结构体:
struct Student{
int id; // 学号
char name[20]; // 姓名
char gender; // 性别
int age; // 年龄
float scores[3]; // 成绩
};
定义结构体变量的方法类似于定义普通变量,只需使用结构体名来代替类型名即可。
例如,要定义一个具有上述四个成员的学生结构体变量,可以这样写:
struct Student stu1, stu2; // 声明两个学生结构体变量
在定义结构体变量后,可以使用点运算符(.)来访问结构体的成员变量,并对其赋值或读取值。
例如,如果要设置学生1的姓名和年龄,可以这样写:
stu1.age = 20; // 设置学生1的年龄为20岁
strcpy(stu1.name, "Tom"); // 学生1的姓名为"Tom"
与结构体类似,联合体也是一种自定义的数据类型,它可以包含多个成员变量,但不同之处在于联合体的所有成员变量使用同一块内存空间,因此只能同时存储一个成员的值。
以下是定义一个联合体的一般格式:
union 联合名{
类型 成员1;
类型 成员2;
// ...
};
联合体成员的大小取决于最大成员变量的大小。因此,不论联合体中有多少成员变量,它所占用的内存大小始终是最大成员的大小。
例如,以下是一个用于表示颜色的联合体:
union Color{
unsigned int value; // 颜色值
unsigned char rgb[3]; // RGB值
};
定义联合体变量的方法与定义结构体变量类似。在定义联合体变量时,指定的类型是联合体的名字,而不是它的成员类型。
例如,要定义一个具有上述两个成员的颜色联合体变量,可以这样写:
union Color c1; // 声明一个颜色联合体变量
要存储联合体成员变量的时候,可以像存储结构体成员变量一样使用点运算符,也可以直接赋值给联合体变量本身。例如:
c1.value = 0xFFA500; // 存储颜色值为 "Orange"(橙色)
c1.rgb[0] = 255; // 存储红色值为255
c1.rgb[1] = 165; // 存储绿色值为165
c1.rgb[2] = 0; // 存储蓝色值为0
结构体和联合体有一个重要的区别,即结构体的所有成员变量各自占用一块独立的内存空间,因此结构体的总内存大小等于所有成员变量占用内存大小之和;而联合体的所有成员变量使用同一块内存空间,因此联合体的总内存大小等于最大成员变量的大小。
因此,结构体更适合用于存储多个相关的数据项,而联合体则更适合在不同的数据类型之间进行类型转换。
在C语言中,结构体和联合体是用于自定义数据类型的两种方法。它们可以包含多个成员变量,并且可以被同时访问和操作。结构体的所有成员变量占用独立的内存空间,而联合体的所有成员变量使用同一空间。因此,结构体更适合用于存储多个相关的数据项,而联合体则更适合在不同的数据类型之间进行类型转换。