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 ", 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 ", size); if (a.b == 0x78) printf("little endian "); else printf("big endian "); return 0; }
联合体的用法还很多,可以自行查资料了解。