【33】C语言 | 联合体详解

news2024/9/23 3:31:26

目录

1、联合类型的定义

2、联合的特点

3、联合大小的计算


1、联合类型的定义

  • 联合也是一种特殊的自定义类型
  • 这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间《所以联合也叫共用体)

先看下面代码输出什么?

union Un
{
	char c;
	int i;
};

int main()
{
	union Un u;
	printf("%p\n",&u);
	printf("%p\n",&(u.c));
	printf("%p\n",&(u.i));
	return 0;
}

2、联合的特点

 上面代码输出的地址是一样的,为什么呢?

因为:

  • 联合的成员是某用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小(因为联合至少得有能力保存最大的那个成员)

 举例:

  • 判断当前计算机的大小端存储
  • 大端存储就是高字节序放在低地址。
  • 小端存储就是高字节序放在高地址。

以前的代码

int main()
{
	int a = 1;
	if(*(char*)&a == 1)
	{
		printf("小端存储\n");
	}
	else
	{
		printf("大端存储\n");
	}
	return 0;
}

 把判断大小端写成一个函数

int check_sys()
{
	int a = 1;
	if((*(char*)&a) == 1)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}
int main()
{
	int ret = check_sys();
	if(ret == 1)
	{
		printf("小端存储\n");
	}
	else
	{
		printf("大端存储\n");
	}

	return 0;
}

 下面我们用联合类型写上面这个函数

通过联合体我们得出自己的电脑存储方式:

int check_sys()
{
	union U
	{
		char c;
		int i;
	}u;
	u.i = 1;
	return u.c;
}
int main()
{
	int ret = check_sys();
	if(ret == 1)
	{
		printf("小端存储\n");
	}
	else
	{
		printf("大端存储\n");
	}

	return 0;
}

我们再和结构体做一下比较

#include<stdio.h>
//结构体
struct u  //u表示结构体类型名
{
    char a;     //a表示结构体成员名
    int b;
    short c;
}U1;      
//U1表示结构体变量名  
//访问该结构体内部成员时可以采用U1.a=1;其中"点"表示结构体成员运算符
 
//联合体
union u1  //u1表示联合体类型名
{
    char a;    //a表示联合体成员名
    int b;
    short c;
}U2;
//U2表示联合体变量名  
//访问该联合体内部成员时可以采用U2.a=1;其中"点"表示联合体成员运算符
 
 
int main(){
    printf("%d\n",sizeof(U1));
    printf("%d\n",sizeof(U2));
    return 0;
}
 
//程序运行结果是:
//12
//4

 总结:

  • 结构体各成员各自拥有自己的内存,各自使用互不干涉,同时存在的,遵循内存对齐原则。一个struct变量的总长度等于所有成员的长度之和。
  • 联合体各成员共用一块内存空间,并且同时只有一个成员可以得到这块内存的使用权(对该内存的读写),各变量共用一个内存首地址。

3、联合大小的计算

  • 联合的大小至少是最大成员的大小。
  • 当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。

举例:看下面代码输出什么

union Un
{
	char a[5];
	int i;
};
int main()
{
	union Un u;
	printf("%d\n",sizeof(u));

	return 0;
}

  •  各成员共用一块内存空间,并且同时只有一个成员可以得到这块内存的使用权(对该内存的读写),各变量共用一个内存首地址。因而,联合体比结构体更节约内存。一个union变量的总长度至少能容纳最大的成员变量,而且要满足是所有成员变量类型大小的整数倍。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/188268.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

我用css3为好友胡歌的宝宝做了一个动画照片墙

软件人生风雨十年&#xff0c;仙剑一过去也有十年有余了&#xff0c;和胡歌认识那么久&#xff0c;今日喜闻好友胡歌生宝宝的消息&#xff0c;惊喜之余用css3为胡歌的宝宝做了动画照片墙的模板效果。 目录 1. 实现思路 2. 墙体的实现 3. 选取模板素材&#xff0c;进行图片元…

虹科案例 | 石油天然气行业CFD高性能计算解决方案

公司简介 DNV GL 是全球领先的能源、石油和海事行业风险管理及资产绩效提升的软件供应商&#xff0c;主要为客户提供全面的风险管理和各类评估认证服务&#xff0c;认证涉及信息通信技术、汽车及航空天、食品与饮料、医疗等方面。 DNV GL以让世界更安全、更智能、更环保为使命…

随笔记——MQ

文章目录1、 概要2、 为什么使用MQ/使用MQ的好处&#xff1f;3、 使用MQ的缺点&#xff1f;4、 使用MQ会产生的问题及解决办法&#xff1f;4.1、如何保证消息的顺序性&#xff1f;4.2、如何解决消息被重复消费&#xff1f;4.3、如何解决消息丢失&#xff1f;4.4、如何解决消息积…

基于turtle实现的新冠疫情传播模拟 附完整代码可直接运行

代码运行视频参考:https://www.bilibili.com/video/BV1hR4y1h7Te/?spm_id_from=333.999.0.0&vd_source=8f3cf4ad6c08a40d40ca6809c9c9e8ca 高阶版运行结果展示

基于Android的家校互动系统app

需求信息&#xff1a; 功能需求: 1&#xff1a;发通知、发作业 发通知和发作业&#xff0c;是学校教师特有的功能&#xff0c;教师可以通过平台进行通知和作业的发放&#xff0c;每当发一条信息&#xff0c;该班的所有人员便可以收到来自服务器的信息推送&#xff0c;提醒家长打…

经济下行压力下的销售行业,将数据效益最大化方能立于不败之地

2022年9月&#xff0c;世界经济论坛发布《首席经济学家展望》报告&#xff0c;并指出“当前每10位经济学家中&#xff0c;就有7位认为全球经济发生了一定程度的衰退。” 在整体下行的经济环境中&#xff0c;由于销售人员会获悉客户削减预算&#xff0c;推迟采购&#xff0c;或…

mysql服务nginx和firewalld代理实现

文章目录环境准备nginx代理mysql服务linux防火墙实现mysql流量转发工作中常常遇到只有某个特定服务器才能访问数据库的情况&#xff0c;这个时候为了解决团队同时访问数据库的问题可以采用nginx代理和linux防火墙流量转发的方式解决。实战测试如下&#xff1a;环境准备 准备一…

做题关键点--位操作符

x |&#xff08;x1&#xff09;去掉从右开始的第一个0 a^a0&#xff0c;异或遵循交换律&#xff0c;即只要存在偶数个a&#xff0c;这部分结果为0. a^0a 与0异或为本身 寻找奇数_牛客题霸_牛客网 不用加减乘除做加法_牛客题霸_牛客网 二进制进行加法运算时与十进制的思路是…

Qt之QtConcurrent无需使用低级线程原语编写多线程

几个要点&#xff1a; 通过QtConcurrent::run()返回的QFuture不支持取消、暂停&#xff0c;返回的QFuture只能用于查询函数的运行/完成状态和返回值。 请注意&#xff1a;该函数可能不会立即运行; 函数只有在线程可用时才会运行。 导入模块 在 C API changes 有关于 Qt Concu…

Linux常用命令——rename命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) rename 用字符串替换的方式批量改变文件名 补充说明 rename命令用字符串替换的方式批量改变文件名。 语法 rename(参数)参数 原字符串&#xff1a;将文件名需要替换的字符串&#xff1b; 目标字符串&#x…

GuLi商城-人人开源搭建前端项目

人人开源&#xff1a; 下载到本地并解压&#xff1a; VsCode打开解压好的项目&#xff1a; MAC安装Nodejs&#xff0c;略 参考&#xff1a;MAC(m1)-安装Nodejs_ZHOU_VIP的博客-CSDN博客 MAC打开终端&#xff1a; npm install类似maven下载所有的组件 报错&#xff1a; 解…

Vue基础10之插件、scoped与lang的样式

Vue基础10插件scoped与lang样式scopedlang样式安装lessless样式的使用总结插件 plugins.js: export default {install(Vue){console.log("Vue:",Vue)//全局过滤器Vue.filter(mySlice,function (value){return value.slice(0,5)})//定义全局指令Vue.directive(fbind,…

【数据结构】8.6 基数排序

文章目录基数排序定义基数排序算法基数排序算法分析基数排序定义 前述的各类排序方法都是建立在关键字啊比较的基础上&#xff0c;而分配类排序不需要比较关键字的大小&#xff0c;它是根据关键字中各位的值&#xff0c;通过对待排序记录进行若干趟分配与收集来实现排序的&…

微信小程序 Springboot卫生应急培训报名系统java

本文以微信开发者、Springboot框架、java为开发技术&#xff0c;实现了一个卫生应急培训小程序。卫生应急培训小程序的主要使用者分为管理员服务端和用户客户端&#xff0c;其中管理员服务端权限&#xff1a;首页、个人中心、用户管理、通知公告管理、在线学习管理、培训管理、…

中国电子学会2021年09月份青少年软件编程Python等级考试试卷一级真题(含答案)

青少年软件编程&#xff08;Python&#xff09;等级考试试卷&#xff08;一级&#xff09; 分数&#xff1a;100.00 题数&#xff1a;37 一、单选题&#xff08;共25题&#xff0c;每题2分&#xff0c;共50分&#xff09; 1. 取整除的运算符是&#xff1f;&#x…

每天一道大厂SQL题【Day02】

每天一道大厂SQL题【Day02】 大家好&#xff0c;我是Maynor。相信大家和我一样&#xff0c;都有一个大厂梦&#xff0c;作为一名资深大数据选手&#xff0c;深知SQL重要性&#xff0c;接下来我准备用100天时间&#xff0c;基于大数据岗面试中的经典SQL题&#xff0c;以每日1题…

nuxt.js项目搭建

nuxt[文档数据] https://www.xuanmo.xin/details/3240 nuxt文档:https://zhuanlan.zhihu.com/p/76703748 nuxt文档:https://www.cnblogs.com/chanwahfung/p/12899714.html axios:https://axios.nuxtjs.org/ 参考:https://www.w3cschool.cn/nuxtjs/nuxtjs-b4kl36fw.html 案例实现…

编程的GCRoot应该怎么去找?

本文导读 本文通过抛出一个编程的上帝视角问题&#xff0c;我们了解什么是编程的上帝视角&#xff0c;编程如何学习以及编程的root是什么&#xff0c;找到root之后&#xff0c;我们有如何利用上帝视角去解决编程中的推理。 一、编程的上帝视角 上帝视角乃是叙述视角中&#…

23.网络编程(一)

目录 一.网络编程 1.1 什么是网络编程 1.2 网络通信基本模式 1.3 网络通信三要素 1.4 IP地址 1.4.1 什么是IP地址 1.4.2 IP的常见分类 1.4.3 IP地址基本寻路 1.4.4 IP地址形式 1.4.5 IP常用命令&#xff08;在命令提示符窗口中使用&#xff09; 1.4.6 特殊IP地址 1…

Docker安装Postgresql

测试环境&#xff1a;Centos7.x docker1.13.1 postgres12本文使用的是在镜像仓库直接pull的方式&#xff0c;非Dockfile的方式。Postgresql的Dockerfile参考&#xff1a;https://github.com/docker-library/postgres/blob/master/12/alpine/Dockerfile常用命令docker命令大全…