C语言教程(十八):C 语言共用体详解

一、共用体的定义

共用体的定义和结构体类似,使用 `union` 关键字,其基本语法如下:

union 共用体名 {

数据类型 成员1;

数据类型 成员2;

// 可以有更多成员

};

以下是一个简单的共用体定义示例:

复制代码
union Data {
    int i;
    float f;
    char str[20];
};

在这个例子中,定义了一个名为 `Data ` 的共用体,它包含三个成员:一个整数 `i` 、一个浮点数 `f` 和一个字符数组 `str`

二、共用体变量的定义和初始化

2.1、定义共用体变量

和结构体一样,共用体变量的定义有两种常见方式。

**一、**在定义共用体类型时同时定义变量:

复制代码
union Data {
    int i;
    float f;
    char str[20];
} data1, data2;

**二、**先定义共用体类型,再定义变量:

复制代码
union Data {
    int i;
    float f;
    char str[20];
};
union Data data1;

2.2、初始化共用体变量

共用体变量只能初始化一个成员。例如:

复制代码
union Data data = {10};  // 初始化整数成员 i这里只对 `i` 成员进行了初始化,因为共用体的所有成员共享同一块内存空间,同一时间只能存储一个成员的值。

三、共用体成员的访问

使用成员访问运算符 `.` 来访问共用体变量的成员,示例如下:

复制代码
#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 ` 共用体,`str ` 数组占用的内存最大(20 字节),所以 `Data ` 共用体的大小就是 20 字节。可以使用 `sizeof` 运算符来验证:

复制代码
#include <stdio.h>

union Data {
    int i;
    float f;
    char str[20];
};

int main() {
    printf("共用体 Data 的大小: %zu 字节\n", sizeof(union Data));
    return 0;
}

五、共用体的用途

5.1、节省内存

当程序中需要处理不同类型的数据,但同一时间只使用其中一种类型的数据时,使用共用体可以节省内存。例如,在一个数据结构中,某些字段在不同情况下可能是不同类型的数据,使用共用体可以避免为每种类型都分配独立的内存空间。

5.2、数据类型转换

共用体可以用于数据类型的转换。例如,通过共用体可以直接访问一个浮点数的二进制表示:

复制代码
#include <stdio.h>

union FloatData {
    float f;
    unsigned int i;
};

int main() {
    union FloatData fd;
    fd.f = 3.14;
    printf("浮点数 3.14 的二进制表示(十六进制): %x\n", fd.i);
    return 0;
}

六、注意事项

由于共用体的所有成员共享同一块内存,修改一个成员的值会覆盖其他成员的值,所以在使用共用体时要确保同一时间只使用一个成员。

共用体的成员访问和赋值需要谨慎,避免因为数据类型不匹配或未正确初始化而导致错误。

相关推荐
前端世界4 分钟前
当网络里混入“假网关”:用 Scapy 写一个 DHCP 欺骗检测器(附完整代码与讲解)
开发语言·网络·php
千里镜宵烛4 分钟前
Lua-编译,执行和错误
开发语言·lua
赵谨言16 分钟前
基于python二手车价值评估系统的设计与实现
大数据·开发语言·经验分享·python
奔跑吧邓邓子35 分钟前
【C语言实战(59)】C语言打造你的专属密码管家
c语言·开发实战·密码管家
java1234_小锋1 小时前
PyTorch2 Python深度学习 - 初识PyTorch2,实现一个简单的线性神经网络
开发语言·python·深度学习·pytorch2
胡萝卜3.01 小时前
C++面向对象继承全面解析:不能被继承的类、多继承、菱形虚拟继承与设计模式实践
开发语言·c++·人工智能·stl·继承·菱形继承·组合vs继承
Violet_YSWY1 小时前
将axios、async、Promise联系在一起讲一下&讲一下.then 与其关系
开发语言·前端·javascript
luoganttcc1 小时前
用Python的trimesh库计算3DTiles体积的具体代码示例
开发语言·python·3d
我爱画页面2 小时前
vue3封装table组件及属性介绍
开发语言·javascript·ecmascript
逻极2 小时前
Next.js vs Vue.js:2025年全栈战场,谁主沉浮?
开发语言·javascript·vue.js·reactjs