C语言联合体(共用体)使用方法及大小计算
作者的话
本文介绍联合体的定义、如何使用联合体,包括联合体的声明、联合体变量创建、联合体内存使用,以及联合体大小的计算,最后附上用联合体判断当前环境是大端还是小端的方法。
联合体的定义
联合体,又叫共用体,是由程序员自己设定的一种自定义数据类型。和结构体一样,联合体也拥有许多成员变量,不过其所有的成员变量占用空间的地址都相同,即所有成员使用同一份空间。
如何使用联合体
1)联合体声明
union 联合体名
{
//...
//...成员变量
};
union加空格后输入联合体名,随后大括号内写所有的成员变量,最后分号结束语句。
2)联合体变量创建
1,声明时创建:在声明一种联合体类型时就直接创建要用的变量,像这样:

2,声明后创建:在声明联合体之后再创建要用的变量,像这样:

变量若是在函数外创建,则为全局变量;若是在函数内创建,则为局部变量。
3)联合体内存使用
若想在某个联合体变量内存储数据,在赋值时需要精确到成员变量。

正确赋值方法:

此外,当对联合体较小的成员变量赋值时,不会销毁或初始化未涉及到内存区域。
证明:
当s1.a为INT_MAX时,以十六进制打印s1.a结果为7FFFFFFF。
对s1.b赋值后,再次打印四个字节,若高位的三个字节仍然是7FFFFF,则得证。
#include<stdio.h>
#include<limits.h>
union my_union
{
int a;
char b;
};
union my_union s1;
int main()
{
s1.a =INT_MAX;
printf("%X\n", s1.a);
s1.b = 0;
printf("%X\n", s1.a);
return 0;
}
效果图:

联合体大小计算
1)计算规则
联合体大小至少为最多成员变量的大小。
原因也很简单,联合体的内存必须能容纳小其任一个成员变量。联合体的总大小必须是最大对其数的整数倍。
原因和结构体一样,为了访问速度,为了增强移植性等。
2)例题
请计算s1,s2,s3各自的大小。
union
{
int a;
char b;
short arr1[5];
}s1;
union
{
int a;
char b;
int arr2[20];
}s2;
union
{
int a;
char b;
char c;
}s3;
答:
int main()
{
printf("%d\n", sizeof(s1));
printf("%d\n", sizeof(s2));
printf("%d\n", sizeof(s3));
return 0;
}

巧用联合体、判断大小端
请你用设计一个程序,利用联合体判断当前环境是大端还是小端。(禁止使用指针)
对于这样一个联合体s1来说:
union
{
int a;
char b;
}s1;
使用a时,会从低位向高位读取4个字节;
使用b时,会从低位向高位读取1个字节。
那么,只要我们令s1.a=1,然后再利用s1.b访问一下s1的低位的一个字节,看看是否为1即可。
若为1,则代表低位字节放在了低位,是小端。
若为0,则代表低位字节放在了高位,是大端。

打印结果是1,符合博主使用的环境。
感谢您的阅读与耐心~
C语言联合体(共用体)使用方法及大小计算的更多相关文章
- C语言:结构体和联合体(共用体)
结构体:struct 1.结构体变量的首地址能够被其最宽基本类型成员的大小所整除. 2.结构体每个成员相对于结构体首地址的偏移量(offset)都是成员的整数倍. 3.结构体的总大小为结构体最宽基本类 ...
- (C语言)共用体union的使用方法举例
曾经在学校学习C语言的时候一直搞不懂那个共用体union有什么用的.工作之后才发现它的一些妙用,现举比例如以下: 1. 为了方便看懂代码. 比方说想写一个3 * 3的矩阵,能够这样写: [ 注:以下用 ...
- C语言之共用体
最近在复习C语言,特再次记录: 有时需要将几种不同类型的变量存放到同一段内存单元中.如一个int.float.char放在同一个地址开始的内存单元中.,也就是使用覆盖技术,几个变量相互覆盖,称之为共用 ...
- Go语言 6 结构体、方法和接口
文章由作者马志国在博客园的原创,若转载请于明显处标记出处:http://www.cnblogs.com/mazg/ Go学习群:415660935 结构体(struct)是由一系列具有相同类型或不同类 ...
- (转)C语言union(联合体 共用体)
一直以来,union都是个很少用到的东西,对于这些不常用的结构往往记不住.这次看书又看到了,还是学习一下吧.一般在Windows API的一些数据结构中才能看到这个union,其实并不复杂.本质上来说 ...
- Go语言之结构体与方法
一.结构体 结构体是一系列属性的集合(类似于 Python 中的类) 1.结构体的定义与使用 // 定义 type Person struct { Name string Age int Sex st ...
- [C#.NET 拾遗补漏]14:使用结构体实现共用体
在 C 和 C# 编程语言中,结构体(Struct)是值类型数据结构,它使得一个单一变量可以存储多种类型的相关数据.在 C 语言中还有一种和结构体非常类似的语法,叫共用体(Union),有时也被直译为 ...
- 嵌入式-C语言基础:联合体和共用体的概念
有时候同一块内存空间存放类型不同,不同类型的变量共享一块空间. 结构体和共用体的区别: (1)结构体元素有各自单独空间,共用体元素共享空间,空间大小由最大类型确定. (2)结构体元素互不影响共用体赋值 ...
- 不可或缺 Windows Native (8) - C 语言: 结构体,共用体,枚举,类型定义符
[源码下载] 不可或缺 Windows Native (8) - C 语言: 结构体,共用体,枚举,类型定义符 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 结构体 ...
- 全国计算机等级考试二级教程-C语言程序设计_第14章_结构体、共用体和用户定义类型
函数的返回值是结构体类型 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> struct ...
随机推荐
- day05-Vue02
Vue02 7.修饰符 7.1基本说明 修饰符(Modifiers)是以.指明的后缀,指出某个指令以特殊方式绑定 官方文档:修饰符 Vue中的修饰符有: 事件修饰符 按键修饰符 系统修饰符 事件修饰符 ...
- C++ 使用 new 创建二维数组
1. 直接创建 C++ 使用 new 创建二维数组最直接的方法就是 new T[M][N].返回的指针类型是 T (*)[N],它是指向数组的指针,可以直接使用数组下标形式访问元素.释放内存直接使用d ...
- ArcGIS实现打点、线路图、色块、自定义弹窗
闲聊: 马上就要过年了,不知道大家过年都放几天假,小颖公司就只放8天假,就这还有一天是集体调休扣年假,就很··············还不如不放,不过庆幸最近这两周项目也做完了也没啥事,不然就静不下心 ...
- 基于 VScode 搭建 Verilog 自动格式化
插件 Verilog-HDL/SystemVerilog/Bluespec SystemVerilog SystemVerilog and Verilog Formatter 工具 https://g ...
- Odoo View 常用技巧
隐藏Field <field name="currency_id" invisible="True"/> <field name=" ...
- SpringBoot+MyBatis的动态SQL、使用动态SQL时List传值错误解决方案
目录 实现动态SQL的四种方式: 1.XML配置 2.脚本SQL 3.在方法中构建SQL 4.结构化SQL 关于动态SQL的List传值错误问题 1.错误代码 2.解决错误 实现动态SQL的四种方式: ...
- IoT 边缘集群基于 Kubernetes Events 的告警通知实现
背景 边缘集群(基于 树莓派 + K3S) 需要实现基本的告警功能. 边缘集群限制 CPU/内存/存储 资源紧张,无法支撑至少需要 2GB 以上内存和大量存储的基于 Prometheus 的完整监控体 ...
- Python 元组列表排序:初学者可能忽视的细节
P1085 [NOIP2004 普及组] 不高兴的津津 题目描述 津津上初中了.妈妈认为津津应该更加用功学习,所以津津除了上学之外,还要参加妈妈为她报名的各科复习班.另外每周妈妈还会送她去学习朗诵.舞 ...
- TCP/IP 协议(10):TCP 协议一百问
TCP/IP 协议(10):TCP 协议一百问 杨领well 的 TCP/IP 协议专栏 TCP 协议部分一直没有更新,是因为我不确定到底应该怎么来介绍 TCP 协议才能干货满满.最后我决定以 Q&a ...
- 详解神经网络基础部件BN层
摘要:在深度神经网络训练的过程中,由于网络中参数变化而引起网络中间层数据分布发生变化的这一过程被称为内部协变量偏移(Internal Covariate Shift),而 BN 可以解决这个问题. 本 ...