欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C 语言 共用体(联合体)union

程序员文章站 2022-07-11 18:53:07
...

几个不同的变量共享一段内存的结构,称为“共用体”类型的结构。

定义共用体类型变量的一般形式为:

union 共用体名
{
    成员表列
}变量表列;

例如:

union Data
{
    int i;        //表示不同类型的变量i,ch,f可以存放到同一段存储单元中
    char ch;
    float f;
}a, b, c;        //变量

在地址空间中表示如下图:

C 语言 共用体(联合体)union

以上3个变量在内存中占的字节数不同,但都是从同一地址开始(图中设为1000)存放,也就是使用覆盖技术,后一个数据覆盖了前面的数据。

  共用体类型数据的特点:

(1)同一内存段可以用来存放几种不同类型的成员,但在每一瞬间只能存放其中一个成员,而不是同时存放几个。

union Data
{
    int i;        //表示不同类型的变量i,ch,f可以存放到同一段存储单元中
    char ch;
    float f;
}a, b, c;        //变量
a.i = 97;

表示将整数97存放在共用体变量中,输出结果如下。

        C 语言 共用体(联合体)union

97换成16进制为0x00000061,又因为电脑的存储方式为小端格式,所以在地址中存在的方式如下图

        C 语言 共用体(联合体)union

因为float的存储方式不同,解码时会按照独自的方式计算解码(可自行搜索float类型数据在内存中的存储方式),所以输出为0.00000。

当a.f = 0x61;时,输出入下图:(打印a.ch时,因为0x0不能用字符打印,所以用的整型,效果一样)

        C 语言 共用体(联合体)union

存储方式为:

        C 语言 共用体(联合体)union

所以float类型97存储的十六进制为0x42C20000。

(2)可以对共用体变量初始化,但初始化表中只能有一个常量。

union Data
{
    int i;        //表示不同类型的变量i,ch,f可以存放到同一段存储单元中
    char ch;
    float f;
}a = {1,'a',1.5};              //不能初始化3个成员,他们占用同一段存储单元
union Data a = {16};           //正确,对第一个成员初始化
union Data a = {.ch = 'j'};    //C99允许对指定的一个成员初始化

(3)共用体变量中起作用的成员是最后一次被赋值的成员,在对共同体变量中的一个成员赋值后,原有变量存储单元中的值就被取代。

(4)共用体变量的地址和它的个成员的地址都是同一个地址。例如:&a.i,&a.ch,&a.f都是同一值。

        C 语言 共用体(联合体)union

(6)共用体类型可以出现结构体类型定义中,也可以定义共用体数组。结构体中也可以出现在共用体类型定义中,数组也可以作为共用体成员。

用途:

在数据处理中,需要对同一空间安排不同的用途,使用共同体比较方便。

    例:有若干个人员的数据,其中有学生和教师。学生的数据中包括:姓名、号码、性别、职业、班级。教师的数据包括:姓名、号码、性别、职业、职务。要求用同一表格来处理。

    可以看出:学生和老师的数据的项目大多数是相同的,只有一个不同,学生的班级,教师的职位。

struct{
    int num;          //成员 编号
    char name[10];    //成员 姓名
    char sex;         //成员 性别
    union{            //声明无名共用体类型
        int class;    //成员 班级
        char position[10];//成员 职务
    }category;
}person[2];