1.什么是联合体?
联合体也叫共用体,在C语言中定义联合体的关键字是union,它
是一种特殊的数据结构,特点:它允许不同的数据成员共用同一块内存空间。与结构体不同的是,联合体中的所有成员共享同一块内存空间,但只能同时使用其中的一个成员。
2.联合体的一般形式
union 联合名
{
成员表
};
3.联合体变量的定义方法
先创建类型,再创建变量
// 创建联合体模板union perdata
union perdata
{
int Class;
char Office;
};
// 使用该联合体模板创建两个变量a, b
union perdata a,b;
联合体与typedef结合使用
// 联合体模板union perdata重新命名为perdata_U
typedef union perdata
{
int Class;
char Office;
}perdata_U;
// 使用新名字perdata_U创建两个变量a, b
perdata_U a,b;
4.联合体的应用
直接举栗~~~
#include <stdio.h>
// 声明并定义联合体
union Number {
int int_value;
float float_value;
};
int main() {
union Number num; // 声明一个联合体变量
// 初始化联合体
num.int_value = 42;
// 输出值
printf("Integer value: %d\n", num.int_value);
// 赋予新值
num.float_value = 3.14;
// 输出值
printf("Float value: %f\n", num.float_value);
return 0;
}
打印结果为:
int_value: 42, float_value: 0.000000
int_value: 1078523331, float_value: 3.140000
[Done] exited with code=0 in 3.815 seconds
在这个例子中,MyUnion
是一个包含一个整型成员和一个浮点型成员的联合体。我们可以看到,int_value
和 float_value
共享内存空间,因此修改其中一个成员的值会影响到另一个成员。
5.union与struct结合使用
#include <stdio.h>
union {
// 定义一个包含四个标志位的结构体字段
struct {
unsigned int flag1 : 1; // 第一个标志位,占用一位
unsigned int flag2 : 1; // 第二个标志位,占用一位
unsigned int flag3 : 1; // 第三个标志位,占用一位
unsigned int flag4 : 1; // 第四个标志位,占用一位
} bits;
unsigned int allFlags; // 一个无符号整数字段,用来整体访问所有标志位
} Flags;
int main() {
Flags.bits.flag1 = 1;
Flags.bits.flag2 = 0;
Flags.bits.flag3 = 0;
Flags.bits.flag4 = 1;
printf("Flags.bitsFlags.bits.flag1: %d\n", Flags.bits.flag1);
printf("Flags.bitsFlags.bits.flag2: %d\n", Flags.bits.flag2);
printf("Flags.bitsFlags.bits.flag3: %d\n", Flags.bits.flag3);
printf("Flags.bitsFlags.bits.flag4: %d\n", Flags.bits.flag4);
printf("All flags: %d\n", Flags.allFlags);
return 0;
}
运行结果
Flags.bitsFlags.bits.flag1: 1
Flags.bitsFlags.bits.flag2: 0
Flags.bitsFlags.bits.flag3: 0
Flags.bitsFlags.bits.flag4: 1
All flags: 9
[Done] exited with code=0 in 2.229 seconds
目的:这两个成员共享内存空间,所以它们的值同时指向同一块内存。这种联合体的设计使得我们既可以按照位域来访问成员的各个部分,也可以按照整体来访问成员的整体。既使用整体又能方便地访问具体的字段,提高了代码的灵活性和可读性。