分享

C语言之联合体

 山峰云绕 2023-04-06 发布于贵州

什么是联合体

https://www.toutiao.com/article/7218102342342836747/?log_from=901cd3adf72e_1680745535937#

联合体也是一种数据类型,用户可自定义。不同于结构体成员——它们在结构中都具有单独的内存位置,联合成员则共享同一个内存位置。也就是说,联合中的所有成员都是从相同的内存地址开始。故联合体也叫共用体,因此,可以定义一个拥有许多成员的联合体,但是同一时刻只能有一个成员允许含有一个值。联合体让程序员可以方便地通过不同方式使用同一个内存位置。

联合体的定义

联合的定义方式与结构体是一样的,只是把关键字 struct 改成 union,如下测试代码:

#include <stdio.h>
union test 
{
    int i;
    double x;
    char str[16];
};
int main()
{
    return 0;
}

这种类型的对象可以存储一个整数、一个浮点数或一个字符串。如果想获得联合的空间大小,可以使用 sizeof 运算符。对上例来说,sizeof(union Data)会返回 16。联合中所有成员都是从内存中同一个地址开始的,如下图所示:

为展示联合和结构的差异,看看下面定义的 struct Data,它具有成员 i、x 和 str:

联合体变量的创建方法

创建联合和创建结构的方式相同,下面是几种定义联合体变量的方法:

  • 先创建联合体,然后在创建联合体变量
  • 创建联合体时创建变量
  • typedef别名创建(详见typedef)

如下代码:

#include <stdio.h>
//1.创建时创建
union Test 
{
    int a;
    char b;
}data1;
//1.创建时创建,可以没有名字
union  
{
    int a;
    int b;
}value;

union Flag 
{
    int a;
    int b;
};
int main()
{
    union Flag flag;
    return 0;
}

联合体变量初始化

联合体的变量的初始化和结构体是有区别的,因为所有数据成员占用同一段内存,所以在初始化的时候只能初始化一个数据成员即可。主要初始化有以下方式:

  • 初始化联合体的第一个成员
  • 通过另一个联合体变量初始化
  • 通过指定初始化器初始化一个数据

如下代码:

#include <stdio.h>
//1.创建时创建
union Test
{
    int a;
    char b;
    double c;
};

int main()
{
    //1.初始化一个数据
    union Test test = { 1 };
    //错误: union Test test={1,'A',1.1}
    //2.通过一个初始化另一个
    union Test data = test;
    //3.指定初始化器初始化
    union Test value = { .c = 1.11 };
    return 0;
}

联合体数据访问

联合体中的数据成员必须通过联合体变量去访问,访问方式和结构体没什么区别。变量用.方式访问,指针用->访问,如下测试代码:

#include <stdio.h>
union Test
{
    int a;
    char b;
};
int main()
{
    union Test test = { 65 };
    printf("%d\n", test.a);
    union Test* p = &test;
    putchar(p->a);
    return 0;
}

程序运行结果如下:

联合体Test中的a和b共用内存,int和char之间是可以互相转换的,故这里可以打印A,其他类型就需要注意了,例如char和double类型,数据结果就很难推断。

联合体的应用示例

示例程序| 无需移位的大小端判定

#include <stdio.h>
union Test
{
    int a;
    char b;
}test;
int main()
{
    test.a = 0x12345678;   
    0x78 == test.b? printf("小端模式\n"):printf("大端模式\n");
    return 0;
}

程序打印运行结果:小端模式

示例程序|分离高低字节

#include <stdio.h>
union Test
{
    int num;
    short int data[2];
}test;
int main()
{
    test.num = 0x000F000E;
    printf("lower:%d\n", test.data[0]);
    printf("upper:%d\n", test.data[1]);
    return 0;
}

程序打印运行结果:

当然位段在操作寄存器也是很方便的,这个做嵌入式或者有这方面需求的自行了解。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多