联合体union的基本概念 在C/C++语言中,有时需要在同一段内存单元中存放不同类型的变量,如把一个整形变量int、一个字符型变量char和一个双精度实型变量double放在同一个地址开始的内存单元中,这3个变量虽然在内存中占的字节数不同,但都从同一地址开始,使用覆盖技术,后一个数据覆盖了前面的数据。这便是联合体union(或者叫共用体)诞生的目的所在。其主要特点是: lunion中可以定义多个成员,union的大小由最大的成员的大小决定 lunion成员共享同一块大小的内存,一次只能使用其中的一个成员 l对union某一个成员赋值,会覆盖其他成员的值 从上面也可以看出,联合体与C语言中的结构体有一些相似之处,但两者有本质上的不同。在结构体中各成员有各自的内存空间, 一个结构变量的总长度是各成员长度之和(空结构除外,同时不考虑边界调整)。而在联合体中,各成员共享一段内存空间, 一个联合变量的长度等于各成员中最长的长度。 联合体union的定义方式 在C/C++语言中,常见的3种定义方式如下: l声明的同时定义变量 l先声明,再定义变量 l匿名定义变量 下图给出了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个例子,完整的实现代码如下: 运行结果如下图所示: 欢迎加关注,共同交流。 |
|