当前位置: 首页 > news >正文

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;
}

六、注意事项

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

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

http://www.xdnf.cn/news/192259.html

相关文章:

  • 基于Python的携程国际机票价格抓取与分析
  • 【MCP教程系列】如何自己打包MCP服务并部署到阿里云百炼上【nodejs+TypeScript】搭建自己的MCP【Cline】
  • 排序算法详解笔记
  • Fiddler+Yakit实现手机流量抓包和小程序抓包
  • 【ESP32】st7735s + LVGL移植
  • 输出圆周率的前n位数字
  • 出口转内销如何破局?“金融+数智供应链”模式含金量还在上升
  • OpenHarmony - 小型系统内核(LiteOS-A)(十三),LMS调测
  • 文献阅读(一)植物应对干旱的生理学反应 | The physiology of plant responses to drought
  • 早投早发表!3本 Nature 新子刊已开放投稿系统!
  • 【前端】从零开始的搭建顺序指南(技术栈:Node.js + Express + MongoDB + React)book-management
  • 97AB-ASEMI机器人功率器件专用97AB
  • transformer-实现单层encoder_layer
  • JavaScript性能优化实战(6):网络请求与资源加载优化
  • 优化MySQL性能:主从复制与读写分离实践指南
  • 设计模式(行为型)解释器模式
  • 用Python做有趣的AI项目5:AI 画画机器人(图像风格迁移)
  • 蓝牙耳机开发--TWS蓝牙耳机双向通信充电盒设计
  • 0805登录_注册_token_用户信息_退出-网络ajax请求2-react-仿低代码平台项目
  • DeepSeek+Dify之三工作流引用知识库案例
  • 第十四章-PHP与HTTP协议
  • Async/Await 必须使用 try/catch 吗?
  • 大模型如何应对内容安全:原理、挑战与技术路径探讨
  • Webug4.0通关笔记02- 第2关布尔注入与第3关延时注入
  • ubantu18.04(Hadoop3.1.3)之Flink安装与编程实践(Flink1.9.1)
  • PostgreSQL与MySQL哪个适合做时空数据分析?
  • 安达发|高效智能塑料切割数控系统 - 全自动化软件解决方案
  • 信创时代技术栈选择与前景分析:国产替代背景下的战略路径与实践指南
  • 穷鬼计划:react+tailwindcss+vercel
  • Git-基本操作