https://www.toutiao.com/article/7218102342342836747/?log_from=901cd3adf72e_1680745535937#
联合体也是一种数据类型,用户可自定义。不同于结构体成员——它们在结构中都具有单独的内存位置,联合成员则共享同一个内存位置。也就是说,联合中的所有成员都是从相同的内存地址开始。故联合体也叫共用体,因此,可以定义一个拥有许多成员的联合体,但是同一时刻只能有一个成员允许含有一个值。联合体让程序员可以方便地通过不同方式使用同一个内存位置。
联合的定义方式与结构体是一样的,只是把关键字 struct 改成 union,如下测试代码:
#include <stdio.h>
union test
{
int i;
double x;
char str[16];
};
int main()
{
return 0;
}
这种类型的对象可以存储一个整数、一个浮点数或一个字符串。如果想获得联合的空间大小,可以使用 sizeof 运算符。对上例来说,sizeof(union Data)会返回 16。联合中所有成员都是从内存中同一个地址开始的,如下图所示:
为展示联合和结构的差异,看看下面定义的 struct Data,它具有成员 i、x 和 str:
创建联合和创建结构的方式相同,下面是几种定义联合体变量的方法:
如下代码:
#include <stdio.h>
//1.创建时创建
union Test
{
int a;
char b;
}data1;
//1.创建时创建,可以没有名字
union
{
int a;
int b;
}value;
union Flag
{
int a;
int b;
};
int main()
{
union Flag flag;
return 0;
}
联合体的变量的初始化和结构体是有区别的,因为所有数据成员占用同一段内存,所以在初始化的时候只能初始化一个数据成员即可。主要初始化有以下方式:
如下代码:
#include <stdio.h>
//1.创建时创建
union Test
{
int a;
char b;
double c;
};
int main()
{
//1.初始化一个数据
union Test test = { 1 };
//错误: union Test test={1,'A',1.1}
//2.通过一个初始化另一个
union Test data = test;
//3.指定初始化器初始化
union Test value = { .c = 1.11 };
return 0;
}
联合体中的数据成员必须通过联合体变量去访问,访问方式和结构体没什么区别。变量用.方式访问,指针用->访问,如下测试代码:
#include <stdio.h>
union Test
{
int a;
char b;
};
int main()
{
union Test test = { 65 };
printf("%d\n", test.a);
union Test* p = &test;
putchar(p->a);
return 0;
}
程序运行结果如下:
联合体Test中的a和b共用内存,int和char之间是可以互相转换的,故这里可以打印A,其他类型就需要注意了,例如char和double类型,数据结果就很难推断。
示例程序| 无需移位的大小端判定
#include <stdio.h>
union Test
{
int a;
char b;
}test;
int main()
{
test.a = 0x12345678;
0x78 == test.b? printf("小端模式\n"):printf("大端模式\n");
return 0;
}
程序打印运行结果:小端模式
示例程序|分离高低字节
#include <stdio.h>
union Test
{
int num;
short int data[2];
}test;
int main()
{
test.num = 0x000F000E;
printf("lower:%d\n", test.data[0]);
printf("upper:%d\n", test.data[1]);
return 0;
}
程序打印运行结果:
当然位段在操作寄存器也是很方便的,这个做嵌入式或者有这方面需求的自行了解。
联系客服