📜  C 共用体(1)

📅  最后修改于: 2023-12-03 15:29:44.584000             🧑  作者: Mango

C语言中的共用体

C语言中的共用体(union)是一种特殊的数据类型,它允许不同的数据类型在同一个内存区域中共用。共用体在内存分配和使用上,不同于结构体的各个成员相互独立,共用体只能同时存放一个成员的值。

使用共用体的场景

共用体通常用于节省内存,可以在一段内存区域中存放不同类型变量的值。共用体的大小根据最大成员的大小来决定,共用体的成员在内存中的偏移地址都相同,即它们的首地址相同,共用体与结构体的不同方面之一就体现在此。

比如有时不确定一个变量的类型,可以使用共用体解决。还有在网络编程中,经常需要将不同类型的数据转化为二进制流传输,使用共用体可以很方便的处理这种问题。

定义和初始化

共用体的定义和结构体类似,可以定义在函数内部或全局,定义时使用关键字 union。共用体初始化的方法和结构体一样,可以通过赋值的方式进行初始化。

union myUnion {
    int i;
    float f;
    char c;
};

int main() {
    union myUnion u = { 123 };
    printf("%d\n", u.i);  // 123
    return 0;
}
成员访问

共用体的成员在内存中位置相同,因此在访问共用体成员时只能同时访问其中一个,也就是访问共用体成员时,必须知道当前使用的哪个成员。

union myUnion u;
u.i = 123;
printf("%d\n", u.i);  // 123
u.f = 1.23;
printf("%f\n", u.f);  // 1.230000

在上面的例子中,共用体 u 中有三个成员 int ifloat fchar c,使用 u.i = 123 赋值时,会把 123 存储在所有成员的内存位置上。接着使用 u.f = 1.23 赋值时,会把 1.23 存储在所有成员的内存位置上,由于 float 类型的数据占用内存的方式和 int 类型不同,因此 123 的值被覆盖了,输出结果为 1.23

注意事项
  • 在使用共用体时,一定要注意成员的访问。
  • 在初始化共用体时,只能初始化其中一个成员。
  • 共用体的大小与最大成员的大小相同,因此共用体的大小可能会比使用普通结构体节省空间。
  • 对共用体成员的修改会影响其他成员的值,需要特别注意。
  • 共用体不能包含自己的类型,因为这样会导致递归定义无法停止,从而产生死循环。
总结

共用体是一种可以灵活地使用内存空间的数据类型,可以让不同类型的变量共享同一段内存空间,但需要注意成员访问的方式,否则可能会导致不可预期的结果。在开发实际项目时,如果能够合理地运用共用体,可以在节约内存的同时,提高代码的可读性和效率。