在 C 语言里,联合体(union)属于一种特殊的数据类型,它允许你在同一块内存空间里存储不同类型的数据。不过,在任意时刻,联合体只能存储其中一个成员的值。
一.定义联合体
联合体的定义与结构体类似,不过它使用union
关键字。以下是一个简单的联合体定义示例:
#include <stdio.h>
// 定义一个联合体
union Data {
int i;
float f;
char str[20];
};
在上述代码中,定义了一个名为Data
的联合体,它包含三个成员:一个整数i
、一个浮点数f
和一个字符数组str
。
二.使用联合体
下面的示例展示了如何使用联合体:
#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: %f\n", data.f);
// 存储字符串
strcpy(data.str, "C Programming");
printf("data.str: %s\n", data.str);
return 0;
}
在这个示例中,我们先定义了一个Data
类型的联合体变量data
,接着分别存储了一个整数、一个浮点数和一个字符串,并且打印出每个成员的值,通过编译结果可以看出。
三.联合体的特点
- 内存共享:联合体的所有成员共享同一块内存空间,这块内存的大小由联合体中最大的成员决定。在上面的例子中,
str
数组是最大的成员,所以Data
联合体的大小为 20 字节。 - 同一时间只有一个成员有效:因为所有成员共享内存,所以在任意时刻,只有一个成员的值是有效的。例如,当你存储了一个浮点数后,之前存储的整数就会被覆盖。
- 当最大的成员大小不是最大对齐数的整数倍时就要对齐到最大对齐数的整数倍。
举例证明:
按照正常来算,union UN1的大小应该是5个字节,但是由于char类型对齐数为1,char c[5]总共就是5,int类型对齐数为4,两者最大为5,但是因为5不是4的倍数,所以浪费3个空间,最终大小为8.
往年面试题:
判断当前计算机的大小端储存:
分析:旨在判大小端储存,首先我们先赋值一个数,那么面临是赋值给i还是c,由于c只占据一个字节,不好判断大小端,所以我们给i先赋值1,那么无非有两种情况:01 00 00 00 或 00 00 00 01,第一种称为小端,第二种称为大端,那么运用联合体相关知识,i、c公用同一块空间,那么我们只需要取出第一块空间,也就是c的空间,又恰好是公共的空间,判断是1还是0,从而判断是大端还是小端......
int main()
{
union UN
{
char c;
int i;
}un;
un.i = 1;
if (un.c == 1)
{
printf("小端\n");
}
else
{
printf("大端\n");
}
return 0;
}
通过结果可以看出,储存方式为 01 00 00 00,也就是小端储存
四.联合体的用途
- 节省内存:当你需要在不同时刻使用不同类型的数据,并且这些数据不会同时使用时,联合体可以节省内存。
- 数据类型转换:联合体可以用于实现简单的数据类型转换。
综上所述,联合体是 C 语言中一种非常有用的数据类型,它允许你在同一块内存中存储不同类型的数据,从而节省内存并实现数据类型的转换。