C语言联合体的使用

1、联合体简介

在C语言编程中,变量的定义是分配存储空间的过程,一般情况下,每个变量都具有自己的存储空间,但是,使用联合体可以实现在同一个内存空间中存储不同的数据类型,任一时刻存储一种数据类型,不是同时存储。

在C语言中,定义联合体的关键字为union,定义一个联合体类型的一般形式如下:

union 联合名
{
  成员表
};

成员表中可以包含若干成员,成员的一般形式为:类型说明符 成员名,联合体类型占用的字节数与成员中最大数据类型占用的字节数一致。

结构体和联合体的区别在于,结构体的各个成员会占用不同的内存,互相之间没有影响,而联合体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。

 

2、联合体变量定义

创建联合体和创建结构体的方式类似,需要一个联合体模板和联合体变量,以下是定义联合体变量的方式:

(2.1)先创建模板,再定义变量

//创建联合体模板union data
union data {
  int a;
  char b;
  double c;
};

//使用联合体模板定义变量a,b,c
union data a, b, c;

在上面的代码中,data是联合体名,由编程人员决定,创建了联合体模板之后,就可以使用该类型去定义变量,在变量定义的时候需要加上union关键字。

(2.2)同时创建模板和变量

//创建联合体模板的同时定义变量
union data {
  int a;
  char b;
  double c;
} a, b;

在上面的代码中,创建联合体模板union data的同时定义了两个变量a、b。

(2.3)省略联合体名

//省略联合体名
union data {
  int a;
  char b;
  double c;
} a, b;

(2.4)使用typedef定义

//联合体模板union data重命名为data_u类型
typedef union data {
  int a;
  char b;
  double c;
} data_u;

//使用data_u类型去创建变量
data_u a, b;

在上述代码中,使用了typedef重新命名联合体模板名。

 

3、联合体初始化

联合体的初始化与结构体不一样,联合体只能存储一个值,有三种初始化方式:

data_u a;
a.a = 10;

//将一个联合体初始化为同类型的联合体
data_u b = a;

//初始化联合体的第一个成员
data_u c = {20};

//指定初始化某个成员
data_u d = {.a = 30};

 

4、实例

(4.1)定义联合体变量并输出其成员值

新创建hello.c文件,并输入下面内容:

#include <stdio.h>

typedef union data {
    int a;
    char b;
    double c;
} data_u;

int main(int argc, char *argv[])
{
    data_u a = {.a = 100};
    
    printf("a.a = %d\n", a.a);
    
    return 0;
}

编译程序并执行,输出效果如下:

(4.2)检测处理器大小端模式

使用联合体来进行判断大小端模式,代码如下所示:

#include <stdio.h>

typedef union data {
    int a;
    char b;
} data_u;

int main(int argc, char *argv[])
{
    int size = sizeof(data_u);
    data_u a = {.a = 0x12345678};
    
    printf("sizeof(data_u) =  %d\n", size);
    
    if (a.b == 0x78)
        printf("little endian\n");
    else
        printf("big endian\n");
    
    return 0;
}

联合体的用法还很多,可以自行查资料了解。

posted @ 2021-03-31 09:17  liangliangge  阅读(1605)  评论(0编辑  收藏  举报