C语言之联合与变体记录(转载https://blog.youkuaiyun.com/qq_31504597/article/details/79940765)

本文深入解析了C语言中的联合与变体记录概念,详细阐述了联合如何允许同一段内存解释为不同数据类型,以及变体记录如何用于处理复杂的数据结构,如仓库中的零件和装配件信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

结构体是将一个对象(内存空间)解释为C语言中多种类型的综合.
联合 是将一个对象(内存空间)在不同时候解释为C语言中不同的类型.

// 联合
union {
float f;
int i;
} fi;
1
2
3
4
5
当使用 fi.f 时, fi所占内存中的内容将被解释为一个float数; 当使用 fi.i 时, fi所占内存中的内容将被解释为一个int类型.
注意: 如果联合的各个成员具有不同的长度, 联合的长度就是最长成员的长度.
可以对联合进行初始化, 但是初始值必须是联合第一个成员的类型.

// 联合初始化
union {
float f;
int i;
} fi = ( 3.1415 }; // fi.f初始化为3.1415
1
2
3
4
5
变体记录 可以看作联合的升级版, 变体记录中联合成员是比int float更为复杂的结构.
考虑下面的情况:
仓库储存两种货物, 一种是零件(part), 一种是装配件(subassembly), 装配件由一些零件组成. 一个零件信息包括零件成本, 零件供应商编号; 一个装配件信息包括组成装配件的零件数, 以及零件信息. 显然, 仓库的一条存货记录(inventory)可能是零件, 也可能是装配件, 并且包含入库日期和操作员编号, 可以用变体记录实现.

// 零件
struct PARTINFO {
int cost; // 零件成本
int supplier; // 供应商编号
};
// 装配件
struct SUBASSYINFO {
int n_parts; // 零件数
PARTINFO parts[MAXPARTS]; // 每个零件信息
};
// 存货记录
struct INVREC {
char date[9]; // 入库日期
int oper; // 操作员编号
enum (PART, SUBASSY} type;
union {
struct PARTINFO part;
struct SUBASSYINFO subassy;
} info;
} record;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
我们可以通过以下方式访问存货记录record.

record.oper 获取存货操作员编号

if(record.type == PART) (存货为零件, info为info.part)
record.info.part.cost 获取存货零件成本
record.info.part.supplier 获取存货零件供应商编号

if(record.type == SUBASSY)(存货为装配件, info为info.subassy)
record.info.subassy.n_parts 获取存货装配件包含零件数
record.info.subassy.parts[0].cost 获取存货装配件第一个零件的成本

作者:Roger-Pang
来源:优快云
原文:https://blog.youkuaiyun.com/qq_31504597/article/details/79940765
版权声明:本文为博主原创文章,转载请附上博文链接!

抱歉,我无法访问链接并提供关于https://blog.csdn.net/qq_40910781/article/details/126666800的具体信息。如果您有关于该链接的具体问题,我将尽力回答您的问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [安装步骤:https://blog.csdn.net/qq_53810245/article/details/123674836](https://download.csdn.net/download/qq_53810245/85022559)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [VUE--组件示例博客https://gudianxiaoshuo.blog.csdn.net/article/detail](https://download.csdn.net/download/shuilan0066/85484805)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [C语言实现MD5算法(源码+打包软件)](https://download.csdn.net/download/hs977986979/88233395)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值