联合体和枚举类型

news2025/4/26 11:52:26

1.联合体类型

1.1:联合体类型变量的创建

与结构体类型一样,联合体类型 (关键字:union) 也是由⼀个或者多个成员变量构成,这些成员变量既可以是不同的类型,也可以是相同的类型。但是编译器只为最⼤的成员变量分配⾜够的内存空间。联合体的特点是所有成员变量共⽤同⼀块内存空间。所以联合体也叫共用体。而结构体中每个成员变量都有自己独立的空间。

#include<stdio.h>
union Un 
{
	char c;//1个字节
	int i;//4个字节
};

int main()
{
	union Un u;
	printf("%zd\n", sizeof(union Un));//4  为char类型的c分配4个字节的空间
	printf("%p\n", &u);//008FFA9C
	printf("%p\n", &(u.c));//008FFA9C
	printf("%p\n", &(u.i));//008FFA9C
	//联合体类型变量u与成员c、成员i的地址相同,由此可见,联合体中的成员是共用同一块内存空间的
	return 0;
}

在这里插入图片描述

1.2:给联合体中一个成员变量赋值时,其他成员变量的值也会发生变化。

在这里插入图片描述

1.3:相同成员的结构体类型和联合体类型的对比

在这里插入图片描述

1.4:联合体类型变量的大小

在这里插入图片描述

#include <stdio.h>
union Un1
{
	//当成员变量是数组时,对齐数 = 数组元素的大小与编译器默认的对齐数中的较小值
	char c[5];//数组元素占1个字节,编译器默认的对齐数是8,则c的对齐数是1
	int i;//i占4个字节,编译器默认的对齐数是8,则i的对齐数是4
	//所有成员中,最大的对齐数是4,则该联合体类型的大小必须是4的倍数
};
union Un2
{
	//当成员变量是数组时,对齐数 =数组元素的大小与编译器默认的对齐数中的较小值
	short c[7];//数组元素占2个字节,编译器默认的对齐数是8,则c的对齐数是2
	int i;//i占4个字节,编译器默认的对齐数是8,则i的对齐数是4
	//所有成员中,最大的对齐数是4,则该联合体类型的大小必须是4的倍数
};
int main()
{
	printf("%d\n", sizeof(union Un1));//8
	printf("%d\n", sizeof(union Un2));//16
	return 0;
}

1.5:结构体类型与联合体类型的对比

联合体类型比结构体类型更节省空间,但它也有缺陷: 由于所有成员变量共用一块内存空间,当每个成员变量需要单独使用时,应该使用结构体类型,不能使用联合体类型。
在这里插入图片描述

1.6:利用联合体类型,写一个程序,判断当前机器是大端字节序存储还是小端字节序存储。

int check_sys()
{
	union   //匿名联合体类型,易知该类型占4个字节
	{
		int i;
		char c;
	}un;
	un.i = 1;
	//1的补码00000000000000000000000000000001
	//1的补码的16进制表示形式:0x00000001
	return un.c;//返回1是⼩端,返回0是⼤端
}

在这里插入图片描述

2.枚举类型

2.1:枚举类型变量的创建

枚举的关键字enum
在这里插入图片描述

enum Sex//性别
{
	//下面是枚举类型变量的可能取值,这些值都是常量。常量的值一旦确定后就无法修改了
	//如果不给这些常量赋初始值的话,默认是从0开始,向下每个常量的取值逐渐加1
	MALE,//男                            MALE的默认值为0,
	FEMALE,//女                          FEMALE的默认值为1,
	SECRET//保密  最后一个取值不加逗号     SECRET的默认值为2
	//MALE、FEMALE、SECRET的类型是enum Sex
};

int main()
{
	enum Sex a = MALE;//根据枚举类型enum Sex创建变量a,a的取值是男
	printf("%d\n", MALE);//0
	printf("%d\n", FEMALE);//1
	printf("%d\n", SECRET);//2
	//MALE=4;   error,MALE是常量,它的值是0,不能被修改 
	return 0;
}
enum Sex//性别
{
	
	MALE=2, //将常量MALE的初始值赋为2                         
	FEMALE,//则常量FEMALE的值就是3 (2+1)                       
	SECRET//则常量SECRET的值就是4 (3+1)   
};

int main()
{
	printf("%d\n", MALE);//2
	printf("%d\n", FEMALE);//3
	printf("%d\n", SECRET);//4
	return 0;
}
enum Sex//性别
{
	
	MALE=3, //将常量MALE的初始值赋为3                       
	FEMALE=4,//将常量FEMALE的初始值赋为4                      
	SECRET//则常量SECRET的值就是5 (4+1)   
};

int main()
{
	printf("%d\n", MALE);//3
	printf("%d\n", FEMALE);//4
	printf("%d\n", SECRET);//5
	return 0;
}
enum Sex//性别
{
	
	MALE=3, //将常量MALE的初始值赋为3                      
	FEMALE=5,//将常量FEMALE的初始值赋为5                     
	SECRET=7//将常量SECRET的初始值赋为7
};

int main()
{
	printf("%d\n", MALE);//3
	printf("%d\n", FEMALE);//5
	printf("%d\n", SECRET);//7
	return 0;
}

2.2:枚举类型需要注意的地方

可以将整数赋值给枚举类型的变量吗?在C语⾔中是可以的,但是在C++是不⾏的,因为C++的类型检查⽐较严格。

enum Sex//性别
{
	MALE,
	FEMALE,
	SECRET
};

int main()
{
	enum Sex a= 0;//因为MALE的值为0,将MALE赋值为枚举类型的变量a
	//上面这句代码在C语言中不会报错,但在C++中会报错。因为C++的类型检查比较严格,C++中认为赋值符号右边的0是int类型,而a是enum Sex类型,所以不能把0赋值给a
	//可以把上面这行代码替换成enum Sex a= MALE;这样无论是C语言还是C++中都不会报错
	return 0;
}

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

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

相关文章

C语言指针5

1.void*概述 void称为无类型&#xff0c;void*称为无类型指针&#xff0c;void不可以单独定义变量&#xff0c;却可以定义无类型的指针&#xff0c;而且所定义的指针称为泛型指针&#xff0c;所谓泛型指针&#xff0c;其含义是void*类型的指针可以接收一切类型变量的地址 struc…

文档构建:Sphinx全面使用指南 — 强化篇

文档构建&#xff1a;Sphinx全面使用指南 — 强化篇 Sphinx 是一款强大的文档生成工具&#xff0c;使用 reStructuredText 作为标记语言&#xff0c;通过扩展兼容 Markdown&#xff0c;支持 HTML、PDF、EPUB 等多种输出格式。它具备自动索引、代码高亮、跨语言支持等功能&#…

深度理解C语言函数之strlen()的模拟实现

文章目录 前言一、strlen的模拟实现二、模拟实现代码及思路2.1 计数法2.2 指针相减法三、递归计数法 总结 前言 我写这篇文章的目的主要是帮助理解C语言中重要函数的用法&#xff0c;后面也会总结C相关的函数的模拟实现&#xff0c;这里的算法不一定是最好的&#xff0c;因为只…

0基础 | Proteus仿真 | 51单片机 | 继电器

继电器---RELAY 本次选择一款5v一路继电器进行讲解 信号输入 IN1输入高电平&#xff0c;三极管导通&#xff0c;LED1点亮&#xff0c;电磁铁12接通吸引3向下与4接通&#xff0c;J1A的12接通 IN1输入低电平&#xff0c;则J1A的23接通 产品引脚定义及功能 序号 引脚符号 引脚…

Python解析地址中省市区街道

Python解析地址中省市区街道 1、效果 输入&#xff1a;海珠区沙园街道西基村 输出&#xff1a; 2、导入库 pip install jionlp3、示例代码 import jionlp as jiotext 海珠区沙园街道西基村 res jio.parse_location(text, town_villageTrue) print(res)

在vscode终端中运行npm命令报错

解决方案 这个错误信息表明&#xff0c;你的系统&#xff08;可能是 Windows&#xff09;阻止了 PowerShell 执行脚本&#xff0c;这是由于 PowerShell 的执行策略导致的。PowerShell 的执行策略控制着在系统上运行哪些 PowerShell 脚本。默认情况下&#xff0c;Windows 可能…

提升变电站运维效率:安科瑞无线测温系统创新应用

一、引言 变电站作为电力系统的关键枢纽&#xff0c;承担着变换电压、分配电能以及控制电力流向等重要任务。在变电站的运行过程中&#xff0c;电气设备的接点温度监测至关重要。过热问题可能由多种因素引发&#xff0c;如电阻过大、接头质量欠佳、衔接不紧密、物理老化等&…

vue3 使用 vite 管理多个项目,实现各子项目独立运行,独立打包

场景&#xff1a; 之前写过一篇 vite vue2 的配置&#xff0c;但是现在项目使用 vue3 较多&#xff0c;再更新一下 vue脚手架初始化之后的项目&#xff0c;每个项目都是独立的&#xff0c;导致项目多了之后&#xff0c;node依赖包过多&#xff0c;占用内存较多。想实现的效果…

WebRTC服务器Coturn服务器用户管理和安全性

1、概述 Coturn服务器对用户管理和安全方面也做了很多的措施&#xff0c;以下会介绍到用户方面的设置 1.1、相关术语 1.1.1 realm 在 coturn 服务器中&#xff0c;域&#xff08;realm&#xff09;是一种逻辑上的分组概念&#xff0c;用于对不同的用户群体、应用或者服务进行区…

如何使用极狐GitLab 的外部状态检查功能?

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;关于中文参考文档和资料有&#xff1a; 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 外部状态检查 (ULTIMATE ALL) pending 状态引入于极狐GitLab 16.5 pending 状态检查的超时时间为两分钟引入于极狐GitLab 16…

【Langchain】RAG 优化:提高语义完整性、向量相关性、召回率--从字符分割到语义分块 (SemanticChunker)

RAG 优化&#xff1a;提高语义完整性、向量相关性、召回率–从字符分割到语义分块 (SemanticChunker) 背景&#xff1a;提升 RAG 检索质量 在构建基于知识库的问答系统&#xff08;RAG&#xff09;时&#xff0c;如何有效地将原始文档分割成合适的文本块&#xff08;Chunks&a…

深入剖析扣子智能体的工作流与实战案例

前面我们已经初步带大家体验过扣子工作流&#xff0c;工作流程是 Coze 最为强大的功能之一&#xff0c;它如同扣子中蕴含的奇妙魔法工具&#xff0c;赋予我们的机器人处理极其复杂问题逻辑的能力。 这篇文章会带你更加深入地去理解并运用工作流解决实际问题 目录 一、工作流…

基于K8s日志审计实现攻击行为检测

K8s日志审计以一种事件溯源的方式完整记录了所有API Server的交互请求。当K8s集群遭受入侵时&#xff0c;安全管理员可以通过审计日志进行攻击溯源&#xff0c;通过分析攻击痕迹&#xff0c;找到攻击者的入侵行为并还原攻击者的攻击路径&#xff0c;修复安全问题。 在本篇文章中…

【Linux网络编程】应用层协议HTTP(实现一个简单的http服务)

目录 前言 一&#xff0c;HTTP协议 1&#xff0c;认识URL 2&#xff0c;urlencode和urldecode 3&#xff0c;HTTP协议请求与响应格式 二&#xff0c;myhttp服务器端代码的编写 HTTP请求报文示例 HTTP应答报文示例 代码编写 网络通信模块 处理请求和发送应答模块 结…

短视频+直播商城系统源码全解析:音视频流、商品组件逻辑剖析

时下&#xff0c;无论是依托私域流量运营的品牌方&#xff0c;还是追求用户粘性与转化率的内容创作者&#xff0c;搭建一套完整的短视频直播商城系统源码&#xff0c;已成为提升用户体验、增加商业变现能力的关键。本文将围绕三大核心模块——音视频流技术架构、商品组件设计、…

STM32定时器---基本定时器

目录 一、定时器的概述 二、时基单元 三、基本定时器的的时序 &#xff08;1&#xff09;预分频器时序 &#xff08;2&#xff09;计数器时序 四、基本定时器的使用 一、定时器的概述 在没有定时器的时候&#xff0c;我们想要延时往往都是写一个Delay函数&#xff0c;里面…

大模型微调 - transformer架构

什么是Transformer Transformer 架构是由 Vaswani 等人在 2017 年提出的一种深度学习模型架构&#xff0c;首次发表于论文《Attention is All You Need》中 Transformer 的结构 Transformer 编码器&#xff08;Encoder&#xff09; 解码器&#xff08;Decoder&#xff09; …

Sentinel数据S2_SR_HARMONIZED连续云掩膜+中位数合成

在GEE中实现时&#xff0c;发现简单的QA60是无法去云的&#xff0c;最近S2地表反射率数据集又进行了更新&#xff0c;原有的属性集也进行了变化&#xff0c;现在的SR数据集名称是“S2_SR_HARMONIZED”。那么&#xff1a; 要想得到研究区无云的图像&#xff0c;可以参考执行以下…

HTMLCSS模板实现水滴动画效果

.container 类&#xff1a;定义了页面的容器样式。 display: flex&#xff1a;使容器成为弹性容器&#xff0c;方便对其子元素进行布局。justify-content: center 和 align-items: center&#xff1a;分别使子元素在水平和垂直方向上居中对齐。min-height: 100vh&#xff1a;设…

【数据可视化艺术·应用篇】三维管线分析如何重构城市“生命线“管理?

在智慧城市、能源管理、工业4.0等领域的快速发展中&#xff0c;地下管线、工业管道、电力通信网络等“城市血管”的复杂性呈指数级增长。传统二维管理模式已难以应对跨层级、多维度、动态变化的管线管理需求。三维管线分析技术应运而生&#xff0c;成为破解这一难题的核心工具。…