c/c++ union

来源:互联网 发布:excel数据统计图表 编辑:程序博客网 时间:2024/06/07 02:19

一、概念

        中文称为共用体或联合体。主要用于共享内存,在C/C++程序的编写中,当多个基本数据类型或复合数据结构要占用同一片内存时,我们要使用联合体;当多种类型,多个对象,多个事物只取其一时(我们姑且通俗地称其为“n 选1”),我们也可以使用联合体来发挥其长处。

       在“联合”中,各成员共享一段内存空间,一个联合变量的长度等于各成员中最长的长度。应该说明的是, 这里所谓的共享不是指把多个成员同时装入一个联合变量内, 而是指该联合变量可被赋予任一成员值,但每次只能赋一种值, 赋入新值则冲去旧值。

二、举例

(1)用union判断大小端


union var{

        char c[4];
        int i;
};


int main(){
        var data;
        data.c[0] = 0x04;
        data.c[1] = 0x03;
        data.c[2] = 0x02;
        data.c[3] = 0x11;

//数组中下标低的,地址也低,按地址从低到高,内存内容依次为:04,03,02,11。总共四字节!
//而把四个字节作为一个整体,应该从内存高地址到低地址看,0x11020304,低位04放在低地址上。
        printf("%x\n",data.i);
}

结果:
      11020304       //证明是小端(little-endian)

(2)含有struct的union

#include <stdio.h>
void main()
{
   union number
  {
       int i;

       struct

       {
          char first;
          char second;
       }half;

  }num;
  num.i=0x4241; /*联合成员赋值*/
  printf("%c%c/n", num.half.first, num.half.second);
  num.half.first='a'; /*联合中结构成员赋值*/
  num.half.second='b';
  printf("%x/n", num.i);
}
输出结果为: 
AB 
6261

三、带对象的union

      由于union里面的东西共享内存,所以不能定义静态、引用类型的变量。由于在union里也不允许存放带有构造函数、析构函数和复制构造函数等的类的对象,但是可以存放对应的类对象指针。编译器无法保证类的构造函数和析构函数得到正确的调用,由此,就可能出现内存泄漏。所以,我们在C++中使用union时,尽量保持C语言中使用union的风格,尽量不要让union带有对象。
0 0
原创粉丝点击