联合体union的基本概念
在C/C++语言中,有时需要在同一段内存单元中存放不同类型的变量,如把一个整形变量int、一个字符型变量char和一个双精度实型变量double放在同一个地址开始的内存单元中,这3个变量虽然在内存中占的字节数不同,但都从同一地址开始,使用覆盖技术,后一个数据覆盖了前面的数据。这便是联合体union(或者叫共用体)诞生的目的所在。其主要特点是:
union中可以定义多个成员,union的大小由最大的成员的大小决定
union成员共享同一块大小的内存,一次只能使用其中的一个成员
对union某一个成员赋值,会覆盖其他成员的值
从上面也可以看出,联合体与C语言中的结构体有一些相似之处,但两者有本质上的不同。在结构体中各成员有各自的内存空间, 一个结构变量的总长度是各成员长度之和(空结构除外,同时不考虑边界调整)。而在联合体中,各成员共享一段内存空间, 一个联合变量的长度等于各成员中最长的长度。
联合体union的定义方式
在C/C++语言中,常见的3种定义方式如下:
声明的同时定义变量
先声明,再定义变量
匿名定义变量
下图给出了3种定义方式的一个例子:
联合体union的使用例子
使用联合体类型,可以实现一些我们意想不到或其它编程语言很难做到的功能,下面给出2个例子。
(1) 将一个32位的整型数拆分为4个单字节的数
如将一个数0x12345678拆分为4个单字节的数为:0x78、0x56、0x34、0x12,则主要实现代码如下:
使用上面代码,可将0x12345678按地址顺序从低到高依次拆分为4个单字节的数:0x78、0x56、0x34、0x12。
(2) 判断当前操作系统的字节序的大、小端问题
主要原理为:在联合体中定义一个4字节整数i和一个单字节整数ch,且赋值i为1(16进制表示为0x00 00 00 01),利用联合体中所有变量共享内存区域的特性,若系统是小端序,则该联合体的低地址端存放的是数值i的低位字节(0x01),反之,若系统是大端序,则存放的是数值i的高位字节(0x00),那么可根据ch的值(存放在该联合体的低地址端,非0即1)来判断当前系统的字节序问题。对应的实现函数代码如下:
对于上面2个例子,完整的实现代码如下:
运行结果如下图所示:
欢迎加关注,共同交流。
领取专属 10元无门槛券
私享最新 技术干货