C语言编程系列005——联合体union的妙用

联合体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个例子,完整的实现代码如下:

运行结果如下图所示:

欢迎加关注,共同交流。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180910A0QIWH00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券