共用体简单例子

//共用体例子
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
//声明无名的结构体类型
struct
{
int num;//成员编号
char name[20];//成员姓名
char sex;//成员性别
char job;//成员职业
union    //声明无名的共用体类型
{
int clas;//成员班级
char position[10];//成员职务
}category;
}person[2];
int main()
{
int i = 0;
for (i = 0; i < 2; i++)
{
printf("请输入第 %d 个成员的各项信息(编号、姓名、性别和职业):\n",i+1);
scanf("%d %s %c %c", &person[i].num, person[i].name, &person[i].sex, &person[i].job);
if ((person[i].job) == 's')
{
printf("输入班级号:\n");
scanf("%d", &person[i].category.clas);
}
else if ((person[i].job) == 't')
{
printf("输入职务:\n");
scanf("%s", &person[i].category.position);
}
else
printf("输入信息有误!\n");
}
printf("输出以上信息:\n");
printf("NO.   name    sex    job  class/position\n");
for (i = 0; i < 2; i++)
{
if ((person[i].job) == 's')
printf("%-6d%-10s%-7c%-7c%-10d\n", person[i].num, person[i].name, person[i].sex, person[i].job, person[i].category.clas);
else
printf("%-6d%-10s%-7c%-7c%-10s\n", person[i].num, person[i].name, person[i].sex, person[i].job, person[i].category.position);
}
return 0;
}
### C/C++ 中共用体(`union`)的使用方法和示例 #### 定义与基本概念 共用体是一种特殊的数据结构,允许不同类型的成员共享相同的内存位置。这意味着在同一时间只能有一个成员被有效使用[^1]。 ```cpp // 定义一个简单共用体 union Data { int i; float f; char str[20]; }; ``` 当创建 `Data` 类型的对象时,编译器会分配足够的连续字节来容纳最大的成员变量,并且这些字节能由任何其他较小或相同大小的成员访问[^4]。 #### 初始化与赋值操作 初始化共用体的方式类似于结构体,可以直接指定初始值给第一个命名成员: ```cpp union Data data = {.i = 10}; // 只能初始化第一个成员 data.f = 3.14f; // 赋值给另一个成员前需先改变当前活跃成员 ``` 每次向新的字段写入数据之前应当确保之前的值不再需要,因为这会导致先前存储的信息丢失[^5]。 #### 匿名共用体的应用场景 有时为了简化代码逻辑或者实现特定功能而采用无名字的共用体形式——即匿名共用体。这类设计模式常见于嵌入式编程领域中用于硬件寄存器映射等场合。 ```cpp struct DeviceRegister { unsigned short all_bits : 16; struct { unsigned short bit_0 : 1; unsigned short bits_1_to_7 : 7; unsigned short reserved : 8; }; }; DeviceRegister reg; reg.all_bits = 0xABCD; printf("%d\n", reg.bit_0); // 访问单个位域 ``` 上述例子展示了如何通过组合结构体内联定义匿名共用体达到同时管理整个寄存器以及其内部各个独立部分的效果。 #### 判断系统字节序的实际应用案例 利用共用体能够轻松检测运行平台所遵循的大端还是小端格式[^3]: ```cpp #include <iostream> union EndianChecker { uint32_t dword; uint8_t bytes[sizeof(uint32_t)]; } endian_checker{0x01020304UL}; int main() { bool is_little_endian = (endian_checker.bytes[0] != 0); std::cout << "System endianness: " << (is_little_endian ? "Little-endian" : "Big-endian") << '\n'; } ``` 此程序片段演示了一个典型的方法:设置一个多字节数值并检查低位地址处的内容即可得知目标机器的具体排列方式。 #### 注意事项 尽管共用体提供了灵活性但也伴随着潜在风险,比如读取未最近写过的成员可能导致不可预测的结果;另外由于缺乏类型安全性,在处理复杂情况时容易引发错误。因此建议开发者谨慎评估是否真的有必要选用这种机制而非现代C++标准库所提供的更为安全可靠的解决方案如`std::variant`[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值