龙空技术网

C语言之联合体

C语言基础 1666

前言:

此刻你们对“同或c语言”大约比较关怀,兄弟们都需要了解一些“同或c语言”的相关资讯。那么小编同时在网摘上收集了一些关于“同或c语言””的相关知识,希望你们能喜欢,朋友们快快来了解一下吧!

什么是联合体

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

联合体的定义

联合的定义方式与结构体是一样的,只是把关键字 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;}

程序打印运行结果:

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

相关

如果阁下正好在学习C/C++,看文章比较无聊,不妨关注下关注下小编的视频教程,通俗易懂,深入浅出,一个视频只讲一个知识点。视频不深奥,不需要钻研,在公交、在地铁、在厕所都可以观看,随时随地涨姿势。

标签: #同或c语言