联合体(Union)是一种数据结构,它可以在相同的内存位置存储不同的数据类型(但是一次只能存储其中一个)。与结构体相比,联合体是一种节省空间的方式,因为它只会分配足够存储最大成员所需的内存量。
联合体的声明
联合体通过union
关键字来声明。联合体的语法类似于结构体,但其成员共享相同的内存位置。
union UnionName {
type1 member1;
type2 member2;
type3 member3;
// 更多成员
};
联合体的特性
- 所有成员共享同一块内存空间。
- 联合体的大小至少为其最大成员的大小。
- 任一时刻,联合体只能存储一个成员的值,对一个成员的更新会影响到其他成员的值。
联合体的使用
联合体可以通过成员访问运算符(.
)来访问其成员。与结构体相同,可以使用联合体变量和指向联合体的指针来访问成员。
示例代码
#include <stdio.h>
union Data {
int i;
float f;
char str[20];
};
int main( ) {
union Data data;
data.i = 10;
printf( "data.i : %d\n", data.i);
data.f = 220.5;
printf( "data.f : %.2f\n", data.f);
strcpy( data.str, "C Programming");
printf( "data.str : %s\n", data.str);
return 0;
}
在上面的例子中,联合体Data
有三个成员:int i
、float f
和char str[20]
。尽管我们对它们进行了三次赋值,但只有最后一次赋值(data.str
)会保留,因为这三个成员共享相同的内存位置。
联合体与结构体的比较
- 内存占用:联合体只占用足以存储最大成员所需的内存量,而结构体的大小是所有成员大小之和。
- 用途:当一个变量可能存储多种类型的数据,但同时只需要存储其中一种类型时,使用联合体可以节省内存空间。
注意事项
- 在访问联合体的某个成员之前,确保已经正确地为该成员赋值。
- 联合体广泛用于低级编程,如直接与硬件接口或协议编程,其中每个字节的空间都很宝贵。