union类型

  union称为共用体,也叫联合体,在一段“联合”内存可以定义多种不同的数据类型, 一个被说明为该“联合”类型的变量中,允许装入该“联合”所定义的任何一种数据,这些数据共享同一段内存,以达到节省空间的目的。union变量所占用的内存长度等于最长的成员的内存长度。
例如,把一个整型变量、一个字符型变量,一个双精度型变量放在同一个地址开始的内存单元中:
u

一、联合体的定义

定义一个联合体类型的一般形式为:
union 联合体名
{
成员表
};
成员表中含有若干成员,成员的一般形式为: 类型说明符 成员名
成员名的命名应符合标识符的规定。
例如:

union perdata
{
int Class;
char Office;
};

  定义了一个名为perdata的联合体类型,它含有两个成员,一个为整型,成员名为Class;另一个为字符,字符名为Office。联合体定义之后,即可进行联合体变量声明,被声明为perdata类型的变量,可以存放整型量Class或存放字符型的变量Office。

二、联合变量的声明

  联合体变量的声明和结构变量的声明方式相同,也有三种形式。即先定义,再声明;定义同时声明和直接声明。

以perdata类型为例,声明如下:
union perdata
{
int Class;
char Office;
};
union perdata a,b;
或者可同时说明为:
union perdata
{
int Class;
char Office;
}a,b;
或直接说明为:
union
{
int Class;
char Office;
}a,b;

  经说明后的a,b变量均为perdata类型。a,b变量的长度应等于 perdata 的成员类型中最长的长度,即等于Class的长度,共4个字节。a,b变量如赋予整型值时,只使用了4个字节,而赋予字符时,可用1个字节。

三、union应用实例

1、试验实例

#include <iostream>
using namespace std;

union test
{
     char mark;
     long num;
     float score;
}a;

int main()
{
     // cout<<a<<endl; // wrong
     a.mark = 'b';
     cout<<a.mark<<endl; // 输出'b'
     cout<<a.num<<endl; // 98 字符'b'的ACSII值
     cout<<a.score<<endl; // 输出错误值

     a.num = 10;
     cout<<a.mark<<endl; // 输出换行 非常感谢suxin同学的指正
     cout<<a.num<<endl; // 输出10
     cout<<a.score<<endl; // 输出错误值

     a.score = 10.0;
     cout<<a.mark<<endl; // 输出空
     cout<<a.num<<endl; // 输出错误值
     cout<<a.score<<endl; // 输出10

     return 0;
}

2、测试CPU是大端模式还是小端模式

#include <iostream>
using namespace std;

void checkCPU()
{
    union MyUnion{
        int a;
        char c;
    }test;
    test.a = 1;
    if (test.c == 1)
        cout << "little endian" <<endl;
    else cout << "big endian" <<endl;
}

int main()
{
    checkCPU();
    return 0;
}

四、union与struct比较

  在结构中各成员有各自的内存空间,一个结构体变量的总长度大于等于各成员长度之和。而在“联合”中,各成员共享一段内存空间,一个联合变量的长度等于各成员中最长的长度。应该说明的是,这里所谓的共享不是指把多个成员同时装入一个联合变量内,而是指该联合变量可被赋予任一成员值,但每次只能赋一种值,赋入新值则冲去旧值。如上面介绍的“单位”变量,定义为一个可装入“班级”或“教研室”的联合后,就允许赋予整型值(班级)或字符型(教研室)。要么赋予整型值,要么赋予字符型,不能把两者同时赋予它。联合类型的定义和联合变量的说明:一个联合类型必须经过定义之后,才能把变量说明为该联合类型。

比较图示:

u3
u1

比较测试:

struct student
{
     char mark;
     long num;
     float score;
};

其struct的内存结构如下,sizeof(struct student)的值为12bytes。

union test
{
     char mark;
     long num;
     float score;
};

sizeof(union test)的值为4。因为共用体将一个char类型的mark、一个long类型的num变量和一个float类型的score变量存放在同一个地址开始的内存单元中,而char类型和long类型所占的内存字节数是不一样的,但是在union中都是从同一个地址存放的,也就是使用的覆盖技术,这三个变量互相覆盖,而这种使几个不同的变量共占同一段内存的结构,称为“共用体”类型的结构。

五、学习参考

1、C语言--联合体-共用体
2、c++学习笔记之结构体、结构体数组和共用体、共用体数组
3、联合体(共同体)总结
4、深入探讨C++11中的非受限联合体

posted @ 2025-09-10 18:20  gdyyx  阅读(20)  评论(0)    收藏  举报