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 ...
随机推荐
- Hive详解(06) - Hive调优实战
Hive详解(06) - Hive调优实战 执行计划(Explain) 基本语法 EXPLAIN [EXTENDED | DEPENDENCY | AUTHORIZATION] query 案例实操 ...
- 迁移学习(MixMatch)《MixMatch: A Holistic Approach to Semi-Supervised Learning》
论文信息 论文标题:MixMatch: A Holistic Approach to Semi-Supervised Learning论文作者:David Berthelot, Nicholas Ca ...
- 【Machine Teaching】An Overview of Machine Teaching
Machine Teaching 1 Introduction 1️⃣ 什么是 Machine Teaching? searching the optimal (usually minimal) te ...
- 微机原理与系统设计笔记2 | 8086CPU结构与功能
打算整理汇编语言与接口微机这方面的学习记录.本部分讲解8086CPU的结构和基本功能以及特性. 参考资料 西电<微机原理与系统设计>周佳社 西交<微机原理与接口技术> 课本&l ...
- 洛谷 P2440木材加工 题解
这是一道二分答案算法题,洛谷标签中的贪心等完全用不到. 这道题的数据范围较大,所以保险起见,整型的数据我们都开成longlong 题意很好理解,这里就不做过多的分析了,直接看代码,后面有注释: #in ...
- vue-echarts数据可视化实现自适应屏幕进行缩放,这个我写了两篇文章,一个用了vue-echarts,一个直接用的charts ,我可真机智 啊~~~
使用这个后可以实现屏幕自适应 效果如下 <template> <div style="width:100%;height:20rem" ref="res ...
- Python3+Selenium3自动化测试-(八)
使用selenium进行测试,当然是需要进行验证的,此时结合python的断言函数就变得非常有用了.测试中设定好预期,当实际情况与预期有差别,给出错误信息,好像正是所希望的. 来一段简单的代码看下断言 ...
- Flutter 3.7 正式发布
新的 Flutter 稳定版加入了 Material 3 更新.iOS 平台优化及其他内容 新年伊始,由 Flutter 3.7 正式版来「打头阵」!我们与整个 Flutter 社区成员们继续在 Fl ...
- 浙江某男子对多端应用开发工具HBuilderX在windows下安装的解说
同学,学uni-app好啊,大致上写一套代码能生成这么多个平台的应用,我简单念一下,它们分别是Android应用.IOS应用.Web应用.微信小程序.支付宝小程序.百度小程序.字节跳动小程序.快应用. ...
- Windows 映射网络驱动器及删除-此网格连接不存在
将共享目录,映射到本地磁盘,可以方便快速访问 添加 点击[此电脑]菜单栏中,选择[计算机]->[映射网格驱动器]-> 文件夹中输入 共享目录地址,如下图 删除 右击,网格映射盘,右击[断开 ...