C语言从头学41——union(联合)结构、enum(枚举)类型

一、union结构可以理解为是一种特殊的 struct 结构,特殊之处在于:
       1、union内部可以包含各种属性,但同一时间只能使用一个属性,它保存的是最后写入(赋值)的属性值。
       2、union结构也可以声明成指针,但指针的属性是变化的,哪个属性在用(也就是最后输入值的属性),哪个属性的数据类型就是它的指针应使用的类型。
       3、union结构的大小与struct不同,struct 的大小大于等于它所有属性占用内存之和;union的大小是它的属性中占用内存最大的那一个。
二、union 结构与 struct 结构相近之处
       1、定义union结构体与定义struct结构体方法近似。
       2、声明union结构体变量与struct近似。
       3、定义的union结构体也可起别名,起别名后也可以省去union关键字。
三、union结构优点:由于所有属性都保存在同一个内存地址,后面写入的属性会覆盖前面的属性,这样做的最大好处是节省内存空间。
四、enum(枚举)类型是一种取值只有少数(有限的)几种可能性的数据类型,由于每种取值都有自己的含义,为了提高代码的可读性,将它们定义为enum(枚举)类型。
五、定义 enum 类型格式很简单:enum 枚举类型名 {枚举值1, ... 枚举值n};。枚举值名字自动成为整数常量,编译器默认将"枚举值1"至"枚举值n"设为整数0至n-1,实际也可以理解为枚举值是整数值的代表,因为枚举值有含义,容易记。例如:
       enum week { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday };
       编译器默认为"Sunday设值0,Monday设值1,... ...",显然看代码时,使用这些枚举值比单纯记忆数值代表什么要容易;如果不想使用编译器默认的设置,可以自行设置,如{枚举值a=1000, 枚举值b=1500,... },但不能使用整数以外的值。
       比如:enum Colors{RED=0xff0000, GREEN=0x00ff00, BLUE=0x0000ff}; //这样设置后,需要使用三种颜色的16进制值时,使用RED、GREEN、BLUE这三个枚举值既方便又易记。
六、枚举类型变量的声明与声明普通变量相同,用上面颜色的例子:
       Colors color; color=RED; printf("RED=%#x",color); //运行结果:RED=0xff0000
七、枚举类型也可以起别名,方法与为结构体起别名一样:typedef enum {枚举值1,枚举值1, ... } 别名;,起别名后使用别名声明变量时,不再需要写enum命令。
八、由于enum的属性会自动声明为常量,因此可以利用这一特点声明常量,枚举类型名就不用要了。如:enum {MIN=0,MAX=10000}; //程序中就可以使用MIN、MAX这两个常量了。
九、enum 的作用域与变量相同。如果是在顶层声明,那么在整个文件内都有效;如果是在代码块内部声明,则只对该代码块有效。
十、有关union结构、enum类型的举例程序如下:

#include<stdio.h>
#include<stdlib.h>
int main(void)
{
//使用匿名方式定义一个别名为myOil的Union结构体typedef union{int buket; //桶float litre; //升}  myOil; //说明:油既可以论桶,也可以论升,桶为整数,升为小数,所以这个结构作为油的量度单位//很适合,需要哪个单位,就使用哪个单位,还不多占内存空间。
//声明一个union结构变量myOil m1;m1.buket = 20;m1.litre = 25.5;printf("myOil=%f\n", m1.litre); //运行结果:myOil=25.500000printf("myOil=%i\n", m1.buket); //运行结果:myOil=1103888384(虽未报错,但显示结果错误)//只有获取最后输入属性值才有正确结果
//如何正确使用union结构指针float* p = (float*) &m1;  //如果用myOil* p=&m1; 这样得出的结果是错误的;如果用int* p=&m1; 结果同样是错误的。//因为最后输入的litre是float类型,所以要用float指针printf("myOil=%f\n", *p); //运行结果:myOil=25.500000
//以别名方式定义一个枚举类型typedef enum  { RED = 0xff0000, GREEN = 0x00ff00, BLUE = 0x0000ff } Colors;Colors color = GREEN; //声明一个枚举变量printf("GREEN的RGB16进制值:%#x\n", color); //运行结果:0xff00color = RED; printf("RED=%#x\n", color);//运行结果:RED=0xff0000
//用枚举类型定义常量{enum { MIN=0,MAX=10000 };//MIN = 500; //如果我们写这个语句,会报错“表达式修饰可修改的左值”,证明MIN是常量printf("MAX的值:%d\n", MAX); //运行结果:10000}//printf("MAX的值:%d", MAX); //前面用{ }把定义常量括起来形成一个语句块,现在到了块外MAX//已不能识别,所以使用 enum 要注意作用域getchar();return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

echarts加载区域地图,并标注点

效果如下&#xff0c;加载了南海区域的地图&#xff0c;并标注几个气象站点&#xff1b; 1、下载区域地图的JSON&#xff1a;DataV.GeoAtlas地理小工具系列 新建nanhai.json&#xff0c;把下载的JSON数据放进来 说明&#xff1a;如果第二步不打勾&#xff0c;只显示省的名字&a…

ECCV 2024前沿科技速递:GLARE-基于生成潜在特征的码本检索点亮低光世界,低光环境也能拍出明亮大片!

在计算机视觉与图像处理领域&#xff0c;低光照条件下的图像增强一直是一个极具挑战性的难题。暗淡的光线不仅限制了图像的细节表现&#xff0c;还常常引入噪声和失真&#xff0c;极大地影响了图像的质量和可用性。然而&#xff0c;随着ECCV 2024&#xff08;欧洲计算机视觉会议…

应急靶场(11):【玄机】日志分析-apache日志分析

题目 提交当天访问次数最多的IP&#xff0c;即黑客IP黑客使用的浏览器指纹是什么&#xff0c;提交指纹的md5查看index.php页面被访问的次数&#xff0c;提交次数查看黑客IP访问了多少次&#xff0c;提交次数查看2023年8月03日8时这一个小时内有多少IP访问&#xff0c;提交次数 …

OrangePi AI Pro 固件升级 —— 让主频从 1.0 GHz 到 1.6 GHz 的巨大升级

前言 OrangePi AI Pro 最近发布了Ascend310B-firmware 固件包&#xff0c;据说升级之后可以将 CPU 主频从 1.0 GHz 提升至 1.6 GHz&#xff0c;据群主大大说&#xff0c;算力也从原本的 8T 提升到了 12T&#xff0c;这波开发板的成长让我非常的 Amazing 啊&#xff01;下面就来…

Linux命令行 复制模式/扩展模式 调用系统功能切换

问题背景 公司软件需要从window 适配国产操作系统&#xff0c;目前使用wine方案。在我们软件有个切换屏幕模式的功能&#xff0c;需要支持用户在我们软件内&#xff0c;切换复制模式/扩展模式。 在linux 下 uos/deepin 等系统。如果要从复制模式设置为扩展模式使用命令行时&a…

Windows下nmap命令及Zenmap工具的使用方法

一、Nmap简介 nmap是一个网络连接端扫描软件&#xff0c;用来扫描网上电脑开放的网络连接端。确定哪些服务运行在哪些连接端&#xff0c;并且推断计算机运行哪个操作系统&#xff08;这是亦称 fingerprinting&#xff09;。它是网络管理员必用的软件之一&#xff0c;以及用以评…

【Bug收割机】已解决使用maven插件打包成功,在控制台使用mvn命令打包失败问题详解,亲测有效!

文章目录 前言问题分析报错原因解决方法私域 前言 在maven项目中&#xff0c;大家经常会使用maven插件来打包项目文件 但是有的人也习惯使用mvn命令在控制台直接进行打包&#xff0c;因为这样可以自定义组装一些命令&#xff0c;使用起来也更加灵活方便&#xff0c;比如mvn pa…

C++进阶-哈希扩展(位图和布隆过滤器)

1. 位图 1.1 位图概念 面试题 给40亿个不重复的无符号整数&#xff0c;没排过序。给一个无符号整数&#xff0c;如何快速判断一个数是否在 这40亿个数中。【腾讯】 解题思路1&#xff1a;暴⼒遍历&#xff0c;时间复杂度O(N)&#xff0c;太慢 解题思路2&#xff1a;排序⼆分查…

mybatis-plus中出现Field ‘id‘ doesn‘t have a default value问题解决方法

问题分析&#xff1a; 出现这个原因&#xff0c;主要是因为mybatis-plus自身查询的特性&#xff0c;因为查询都是它自己内部设定好的参数&#xff0c;一般为了简便&#xff0c;都会默认自己底层的数据库对应的主键id字段是自增的&#xff0c;也就是mybatis-plus认为不需要id,每…

重磅惊喜!OpenAI突然上线GPT-4o超长输出模型!「Her」高级语音模式已开放测试

在最近的大模型战争中&#xff0c;OpenAI似乎很难维持霸主地位。虽然没有具体的数据统计&#xff0c;但Claude3.5出现后&#xff0c;只是看网友们的评论&#xff0c;就能感觉到OpenAI订阅用户的流失&#xff1a; Claude3.5比GPT-4o好用&#xff0c;为什么我们不去订阅Claude呢&…

学习c语言第18天(字符串和内存函数)

1.函数介绍 1.1 strlen size_t(就是无符号整形) strlen(const char * str); 字符串已经\0作为结束标志&#xff0c;strlen函数返回的是在字符串中\0前面出现的字符个数(不包 含\0) 参数指向的字符串必须要以\0结束。 注意函数的返回值为size_t&#xff0c;…

文件系统 --- 文件结构体,文件fd以及文件描述符表

序言 在编程的世界里&#xff0c;文件操作是不可或缺的一部分。无论是数据的持久化存储、日志记录&#xff0c;还是简单的文本编辑&#xff0c;文件都扮演着至关重要的角色。然而&#xff0c;当我们通过编程语言如 C、Java 等轻松地进行文件读写时&#xff0c;背后隐藏的复杂机…

自动化运维工具之Ansible

一、Ansible Ansible是一个基于Python开发的配置管理和应用部署工具&#xff0c;现在也在自动化管理领域大放异彩。它融合了众多老牌运维工具的优点&#xff0c;Pubbet和Saltstack能实现的功能&#xff0c;Ansible基本上都可以实现。 Ansible能批量配置、部署、管理上千台主机…

ADS环境下的ARM汇编程序设计实验报告

ADS环境下的ARM汇编程序 一、 实验目的 1&#xff0e;了解 ARM汇编语言的基本框架,学会使用ARM的汇编语言编程。 2&#xff0e;熟悉ADS1.2下进行汇编语言程序设计的基本流程&#xff1b; 3. 了解AXD中调试功能。 二、 实验环境 硬件&#xff1a;PC机 软件&#xff1a;ADS…

基于VScode和C++ 实现Protobuf数据格式的通信

目录 1. Protobuf 概述1.1 定义1.2Protobuf的优势 2. Protobuf 语法3、序列号和反序列化3.1 .pb.h 头文件3.2 序列化3.3 反序列化 4、测试用例 Protobuf详细讲解链接 1. Protobuf 概述 1.1 定义 protobuf也叫protocol buffer是google 的一种数据交换的格式&#xff0c;它独立…

熵权法确定权重

熵权法&#xff08;Entropy Weight Method, EWM&#xff09;是一种在综合考虑各因素提供信息量基础上计算综合指标的数学方法&#xff0c;属于客观综合定权法&#xff0c;在确定权重时更有说服力。该方法主要根据各指标传递给决策者的信息量大小来确定权重。在信息论中&#xf…

[RoarCTF 2019]Easy Calc1

打开题目 查看源码&#xff0c;看到 看到源代码有 calc.php&#xff0c;构造url打开 看到php审计代码&#xff0c; 由于页面中无法上传num&#xff0c;则输入 num&#xff0c;在num前加入一个空格可以让num变得可以上传&#xff0c;而且在进行代码解析时&#xff0c;php会把前…

库存超卖问题解决方式

文章目录 超卖问题解决方式什么是库存超卖问题&#xff1f;乐观锁和悲观锁的定义超卖问题解决方式一、悲观锁1.jvm单机锁2.通过使用mysql的行锁&#xff0c;使用一个sql解决并发访问问题3.使用mysql的悲观锁解决4. 使用redis分布式锁来解决 二、乐观锁解决1.版本号2. CAS法&…

数据结构第1天作业 7月31日

2.3按位置操作 1&#xff09;按照位置插入数据 void Insert_seqlist_single(Seqlist* sq,int arr_sub,int num){if(sq->posN ){ //判断顺序列表是否为满printf("error");return;}else if(arr_sub<0||arr_sub>sq->pos){printf("error…