什么是联合体https://www.toutiao.com/article/7218102342342836747/?log_from=901cd3adf72e_1680745535937# 联合体也是一种数据类型,用户可自定义。不同于结构体成员——它们在结构中都具有单独的内存位置,联合成员则共享同一个内存位置。也就是说,联合中的所有成员都是从相同的内存地址开始。故联合体也叫共用体,因此,可以定义一个拥有许多成员的联合体,但是同一时刻只能有一个成员允许含有一个值。联合体让程序员可以方便地通过不同方式使用同一个内存位置。 联合体的定义联合的定义方式与结构体是一样的,只是把关键字 struct 改成 union,如下测试代码:
这种类型的对象可以存储一个整数、一个浮点数或一个字符串。如果想获得联合的空间大小,可以使用 sizeof 运算符。对上例来说,sizeof(union Data)会返回 16。联合中所有成员都是从内存中同一个地址开始的,如下图所示: 为展示联合和结构的差异,看看下面定义的 struct Data,它具有成员 i、x 和 str: 联合体变量的创建方法创建联合和创建结构的方式相同,下面是几种定义联合体变量的方法:
如下代码:
联合体变量初始化联合体的变量的初始化和结构体是有区别的,因为所有数据成员占用同一段内存,所以在初始化的时候只能初始化一个数据成员即可。主要初始化有以下方式:
如下代码:
联合体数据访问联合体中的数据成员必须通过联合体变量去访问,访问方式和结构体没什么区别。变量用.方式访问,指针用->访问,如下测试代码:
程序运行结果如下: 联合体Test中的a和b共用内存,int和char之间是可以互相转换的,故这里可以打印A,其他类型就需要注意了,例如char和double类型,数据结果就很难推断。 联合体的应用示例示例程序| 无需移位的大小端判定
程序打印运行结果:小端模式 示例程序|分离高低字节
程序打印运行结果: 当然位段在操作寄存器也是很方便的,这个做嵌入式或者有这方面需求的自行了解。 |
|
来自: 山峰云绕 > 《C语言数据结构描述Windows程序设计》