首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >通过小例子看共用体:数据类型共享内存的奇妙应用与编程启示(建议收藏!!!)

通过小例子看共用体:数据类型共享内存的奇妙应用与编程启示(建议收藏!!!)

作者头像
紫昭
发布2025-11-29 08:39:40
发布2025-11-29 08:39:40
1620
举报
  1. 共用体的基本概念
    • 共用体(也称为联合体)是一种特殊的数据类型,它允许在相同的内存位置存储不同的数据类型。在 C 和 C++ 等编程语言中可以使用共用体。
    • 其语法定义一般形式为:
代码语言:javascript
复制
union [union tag] {
    member - type1 member - name1;
    member - type2 member - name2;
    //...
} [one or more union variables];

例如:
union Data {
    int i;
    float f;
    char str[20];
};
  • 在这里,union Data是一个共用体类型,它有三个成员:一个整数i,一个浮点数f,一个字符数组str。这三个成员共享同一块内存空间。
  1. 小例子解释作用
    • 假设我们有一个设备,它可以接收和发送不同类型的数据,但每次只能处理一种类型的数据。这个设备可能会接收一个整数作为设备 ID,一个浮点数作为温度值,或者一个字符串作为设备名称。
    • 我们可以使用共用体来存储这些不同类型的数据,因为它们不会同时出现。
    • 示例代码如下:
代码语言:javascript
复制
#include <stdio.h>
#include <string.h>

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

int main() {
    union Data data;
    // 存储一个整数
    data.i = 10;
    printf("Stored integer value: %d\n", data.i);
    // 存储一个浮点数
    data.f = 22.5;
    printf("Stored float value: %f\n", data.f);
    // 存储一个字符串
    strcpy(data.str, "Device001");
    printf("Stored string value: %s\n", data.str);
    return 0;
}
  • 在这个例子中,union Data类型的变量data可以根据需要存储不同类型的数据。当我们存储一个整数时,内存空间被用于存储整数;当存储一个浮点数时,相同的内存空间被重新用于存储浮点数;当存储一个字符串时,也是如此。
  • 这种方式节省了内存空间,因为不需要为每种可能的数据类型都分配独立的内存。不过,在使用共用体时需要注意,由于成员共享内存,对一个成员赋值可能会覆盖其他成员的值。例如,在存储了浮点数后再存储字符串,浮点数的值就会被覆盖,因为内存空间被重新分配用于存储字符串了。
  1. 共用体在实际编程中的延伸应用
    • 在嵌入式系统中,共用体常用于处理不同格式的寄存器数据。例如,一个硬件寄存器可能有多种配置方式,有时它存储一个整数作为设备状态码,有时它存储一个位字段结构体来表示不同的设备功能位。
    • 以一个简单的设备控制寄存器为例,它可能有以下几种表示方式:
代码语言:javascript
复制
union Register {
    uint32_t all_bits;
    struct {
        uint16_t status : 8;
        uint16_t config : 8;
    } bit_fields;
};
  • 在这里,nion Registeru可以通过all_bits成员整体访问 32 位的寄存器值,也可以通过bit_fields成员访问寄存器中的不同位字段,这样在对寄存器进行读写操作时就更加灵活,方便我们据实际需求来处理数据。

“学如逆水行舟,不进则退。” 愿此篇文章成为你在技术之舟上的有力桨橹。有任何感悟或困惑,可于评论区交流探讨。若觉有益,点赞、收藏不妨一试,也期待你关注我。在技术的漫漫征途中,愿与君相伴同行,共赏知识繁花盛景,同历成长蜕变之喜。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-11-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档