眼部整形

首页 » 常识 » 问答 » CC语言中联合体union的妙用
TUhjnbcbe - 2023/6/5 20:30:00

联合体union的基本概念

在C/C++语言中,有时需要在同一段内存单元中存放不同类型的变量,如把一个整形变量int、一个字符型变量char和一个双精度实型变量double放在同一个地址开始的内存单元中,这3个变量虽然在内存中占的字节数不同,但都从同一地址开始,使用覆盖技术,后一个数据覆盖了前面的数据。这便是联合体union(或者叫共用体)诞生的目的所在。其主要特点是:

union中可以定义多个成员,union的大小由最大的成员的大小决定union成员共享同一块大小的内存,一次只能使用其中的一个成员对union某一个成员赋值,会覆盖其他成员的值

从上面也可以看出,联合体与C语言中的结构体有一些相似之处,但两者有本质上的不同。在结构体中各成员有各自的内存空间,一个结构变量的总长度是各成员长度之和(空结构除外,同时不考虑边界调整)。而在联合体中,各成员共享一段内存空间,一个联合变量的长度等于各成员中最长的长度。

联合体union的定义方式

在C/C++语言中,常见的3种定义方式如下:

声明的同时定义变量先声明,再定义变量匿名定义变量

下图给出了3种定义方式的一个例子:

联合体union的使用例子

使用联合体类型,可以实现一些我们意想不到或其它编程语言很难做到的功能,下面给出2个例子。

(1)将一个32位的整型数拆分为4个单字节的数

如将一个数0x拆分为4个单字节的数为:0x78、0x56、0x34、0x12,则主要实现代码如下:

使用上面代码,可将0x按地址顺序从低到高依次拆分为4个单字节的数:0x78、0x56、0x34、0x12。

(2)判断当前操作系统的字节序的大、小端问题

主要原理为:在联合体中定义一个4字节整数i和一个单字节整数ch,且赋值i为1(16进制表示为0x),利用联合体中所有变量共享内存区域的特性,若系统是小端序,则该联合体的低地址端存放的是数值i的低位字节(0x01),反之,若系统是大端序,则存放的是数值i的高位字节(0x00),那么可根据ch的值(存放在该联合体的低地址端,非0即1)来判断当前系统的字节序问题。对应的实现函数代码如下:

对于上面2个例子,完整的实现代码如下:

运行结果如下图所示:

欢迎加

1
查看完整版本: CC语言中联合体union的妙用