C语言联合和枚举讲解

目录

 联合体的大小

 联合体如何省空间

巧用联合体 

联合判断大小端(惊为天人,大佬写的,我借鉴) 

 枚举

枚举类型的使用 


首先我们先看一下菜鸟教程中的对C语言联合体的说明

 联合体的大小

 

#include <stdio.h>
union u
{char c;int u;
};int main()
{union u n;printf("%zd\n", sizeof(n));return 0;;
}

 这里为什么是4呢?

 

 这里已经给了我们答案,为了更加直观,我们取地址打印一下

 

#include <stdio.h>
union u
{char c;int u;
};int main()
{union u n;printf("%p\n", &n);printf("%p\n", &n.c);printf("%p\n", &n.u);return 0;;
}

 

所以联合体也叫共用体

我们在这解释一下联合体大小应该怎样计算

1.联合体的大小至少是最大成员的大小。

2.当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍

上述的计算方法的第二点我们写个代码再解释一下

#include <stdio.h>
union Un1
{char c[5];//5//注意此时如果是数组的话要按照数据所属的类型大小来计算,char类型就是1//1  8  1int i;//4 8  4
};int main()
{printf("%zd\n", sizeof(union Un1));return 0;
}

 

 有了这样代码中的注释我们或许就能理解结构体大大小是如何计算的。

 联合体如何省空间

 

对于商品来说,他们具有相同的价格类型,产地信息,但有的商品具有的信息别的商品没有,我们完全可以写出一个结构体包含这这个他们的公共属性和各自具有的属性,但这样的话太浪费空间了,比如说你此时就想描述一件商品,那你还需要再描述其他两件不必要的特殊属性了。

因此我们的解决办法是现将公共属性单独写出来,剩余属于各个商品本身的特殊属性我们就用联合体联合起来,这样做的话,就节省了空间。

struct gift_list
{int stock_number;//库存量double price;//定价int item_type;//商品类型union {struct{char title[20];//书名char author[20];//作者int num_pages;//页数}book;struct{char design[30];//设计}mug;struct{char design[20];//设计int colors;//颜色int sizes;//尺寸}shirt;}item; 
};

这样写就很节省空间了。

巧用联合体 

 我们来看一个比较厉害的代码:(一个int类型,一次取出一个字节)

union U
{int n;//4struct S{char c1;char c2;char c3;char c4;}s;//4
};int main()
{union U u = { 0 };u.n = 0x11223344;printf("%x %x %x %x\n", u.s.c1, u.s.c2, u.s.c3, u.s.c4);return 0;
}

联合判断大小端(惊为天人,大佬写的,我借鉴) 

 

int check()
{union{char c;int i;}u;u.i = 1;return u.c;
}int main()
{int ret = check();if (ret == 1)printf("小端\n");elseprintf("大端\n");return 0;
}

 

 此时char不用进行强制转换,因为字符型的ascll类型也是整型

 枚举

enum day
{Mon,Tues,Web,Thur,Fri,Sat,Sun
};int main()
{printf("%d\n", Mon);printf("%d\n", Tues);printf("%d\n",Web);printf("%d\n", Thur);printf("%d\n", Fri);printf("%d\n", Sat);printf("%d\n", Sun);return 0;
}

 

枚举类型默认值为0

还有我们可以对我们枚举中的数据进行初始化,但他们都是常量,因此在主函数中,我们要再想要改变他们的值,那编译器就会报错。我们对其进行初始化我们进行观察一下

 

 

 我们再来看一下我们在主函数中更改他的值进行报错的情况:

 

 

因此在使用时我们应该注意。

枚举类型的变量必须是属于枚举类型的,我们对此进行展示

enum day
{Mon=2,Tues=4,Web=5,Thur=6,Fri=9,Sat=11,Sun=19
};int main()
{enum day s = Mon;s = Fri;return 0;
}

 

枚举的优点:

  1. 增加代码的可读性可维护性
  2. 和#define定义的标识符⽐较枚举有类型检查,更加严谨。
  3. 便于调试,预处理阶段会删除 #define 定义的符号
  4. 使⽤⽅便,⼀次可以定义多个常量
  5. 枚举常量是遵循作⽤域规则的,枚举声明在函数内,只能在函数内使⽤

枚举类型的使用 

enum day
{Mon=2,Tues=4,Web=5,Thur=6,Fri=9,Sat=11,Sun=19
};int main()
{enum day s = Mon;//使用枚举常量给枚举变量赋值return 0;
}

 

C语言中可以拿整数给枚举变量赋值,但C++中不行。

若有收获,就点个赞吧!

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

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

相关文章

Proteus仿真--基于ADC0808设计的调温报警器

本文介绍基于ADC0808实现的调温报警器设计&#xff08;完整仿真源文件及代码见文末链接&#xff09; 温度调节使用滑动变阻器模拟实现&#xff0c;ADC0808采集信号并输出在LCD上面显示&#xff0c;报警系统是LED灯和蜂鸣器实现声光电报警 仿真图如下 仿真运行视频 Proteus仿真…

Java实现二分法的案例,什么是二分法

文章目录 Java实现二分法的案例&#xff0c;什么是二分法二分法实现 Java实现二分法的案例&#xff0c;什么是二分法 二分法 概念&#xff1a; 二分法&#xff08;Bisection method&#xff09; 即一分为二的方法&#xff0c;又叫折半查找方法。把一组有序数列分为左右两部分…

前程无忧接口分析

前程无忧接口分析 所需用到的工具URL解析通过抓包软件或者开发者选项抓取数据包对代码中的参数解析分析对acw_sc__v2进行分析对acw_sc__v2进行转换代码生成生成outPutList数组生成arg2参数生成arg3参数最终的效果 对详情页面的分析对timestamp__1258的生成分析 所需用到的工具 …

Vue3.0优点详解

相对于Vue2.0 3.0有了比较大的改进&#xff0c;优势主要有以下几点&#xff1a; 一、性能提升 1、Vue3.0的响应式系统使用了Proxy代理对象&#xff0c;取代了Vue2.0中的Object.defineProperty&#xff0c;使得Vue3.0的响应式系统更快、更灵活。 2、Vue3.0对TypeScript的支持更…

Ubuntu22.04安装完成后便可直接使用键盘上的Print键进行截图

概要&#xff1a;Ubuntu22.04安装完成后&#xff0c;无需安装什么截图软件&#xff0c;可以直接使用键盘上的Print键进行截图。 1、按一下Print键 我的电脑上Print键是PrtSc&#xff0c;如下图所示 2、框选区域并截图 如下图中&#xff0c;可以框选(Selection)&#xff0c;也…

【教学类-35-06】17号的学号字帖延伸出的全体字帖(1-9去0)(A4竖版1份)

作品展示 背景需求&#xff1a; 给大4班17号同学单独做了一个学号字帖后&#xff0c;我想可以把这样的学具用在中班&#xff08;我马上要成为中4班老师了&#xff09;&#xff0c;那就需要给全班做一份这样的大号学号贴。 使用17号同学的word模板&#xff08;见下文&#xff…

3dMax vs Cinema4d哪个更好更适合你?

Cinema 4d和3dMax的区别 用于游戏风格、开发和风格可视化的3D建模、动画和渲染软件系统&#xff0c;为用户提供制作和编辑动画、视觉效果和环境的灵活性。4D CINEMA可能是由MAXON构建的强大的3D建模、运动图形、绘画和动画软件系统。Cinema 4D将在每个Windows和MAC操作系统上运…

多目标追踪评价指标

多目标追踪性能评价 基础&#xff1a; GT&#xff1a;Ground Truth&#xff0c;是指真实的标签或者真实的对象&#xff1b; TP&#xff1a;True Positive&#xff0c;被正确预测检测到的样本&#xff1b; TN&#xff1a;True Negative&#xff0c;被预测为负的负样本&#…

啃下这50道笔试题,你就是SQL专家!(附答案,收藏备用)

【关注微信公众号&#xff1a;跟强哥学SQL&#xff0c;回复“笔试”免费领取大厂SQL笔试题。】 有两个名为Department&#xff08;部门&#xff09;和Employees&#xff08;员工&#xff09;的表结构如下&#xff1a; CREATE TABLE Department ( DepId int, DepName va…

文章解读与仿真程序复现思路——电力系统自动化EI\CSCD\北大核心《考虑两阶段鲁棒优化配置的多微网合作博弈》

这个标题涉及到多个概念&#xff0c;让我们逐步解读&#xff1a; 考虑两阶段鲁棒优化配置&#xff1a; 两阶段&#xff1a; 指的是在解决问题或进行优化时&#xff0c;可能存在两个不同的阶段或步骤。这表明问题的解决不是一步完成的&#xff0c;而是需要经过多个步骤或阶段。鲁…

前端学习系列之CSS

目录 CSS 简介 发展史 优势 基本语法 引用方式 内部样式 行内样式 外部样式 选择器 id选择器 class选择器 标签选择器 子代选择器 后代选择器 相邻兄弟选择器 后续兄弟选择器 交集选择器 并集选择器 通配符选择器 伪类选择器 属性选择器 CSS基本属性 优…

virtualenv创建虚拟环境

目录 概念安装创建虚拟环境激活虚拟环境删除虚拟环境退出虚拟环境更改虚拟环境路径概念 virtualenv是一个创建隔离的Python运行环境的工具。它允许用户为每个Python项目创建一个独立的虚拟环境,以避免不同项目之间的依赖冲突。 安装 pip install virtualenv virtualenvwrapper…

JS如何实现竖屏轮播图

首先是HTML搭建结构 <div class"banner-box"><div class"bannerbox"><div class"banner"><a class"a-img-ban"> <img class"img-ban" src"./img/640 (4).jpg" alt"终于等到你还…

SpringBoot项目访问resources下的静态资源

1.新建一个配置文件夹&#xff0c;放配置类 2.编辑 WebMvcConfig.java package com.southwind.configuration;import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import or…

openlayers地图使用---跟随地图比例尺动态标绘大小的一种方式3

openlayers地图使用—跟随地图比例尺动态标绘大小的一种方式 预期&#xff1a;随着地图比例尺放大缩小&#xff0c;地图上的标绘随着变化尺寸 思路&#xff1a;通过VectorImage和动态修改Feature尺寸实现Feature跟随地图比例尺尺寸变化 优点&#xff1a;结合第1和第2种方式的…

openlayers地图使用---跟随地图比例尺动态标绘大小的一种方式2

openlayers地图使用—跟随地图比例尺动态标绘大小的一种方式2 预期&#xff1a;随着地图比例尺放大缩小&#xff0c;地图上的标绘随着变化尺寸 思路&#xff1a;通过不断添加地图图层实现标绘的动态缩放 优点&#xff1a;标绘放大缩小非常流畅 缺点&#xff1a;标绘超过1000…

LangChain 22 LangServe用于一键部署LangChain应用程序

LangChain系列文章 LangChain 实现给动物取名字&#xff0c;LangChain 2模块化prompt template并用streamlit生成网站 实现给动物取名字LangChain 3使用Agent访问Wikipedia和llm-math计算狗的平均年龄LangChain 4用向量数据库Faiss存储&#xff0c;读取YouTube的视频文本搜索I…

等待和通知

引入 由于线程是抢占式执行的,因此线程之间的执行的先后顺序难以预知 但是实际开发中我们希望合理协调多个线程之间执行的先后顺序. 这里的干预线程先后顺序,并不是影响系统的调度策略(内核里调度线程,仍然是无序调度). 就是相当于在应用程序代码中,让后执行的线程主动放弃被…

3DCAT+上汽奥迪:打造新零售汽车配置器实时云渲染解决方案

在 5G、云计算等技术飞速发展的加持下&#xff0c;云渲染技术迎来了突飞猛进的发展。在这样的背景下&#xff0c;3DCAT应运而生&#xff0c;成为了业内知名的实时云渲染服务商之一。 交互式3D实时云看车作为云渲染技术的一种使用场景&#xff0c;也逐步成为一种新的看车方式&a…

设备温度和振动综合监测:温振一体式传感器的优点和应用

随着工业设备的复杂性和自动化程度的提高&#xff0c;对设备状态监测的需求也日益增加。温振一体式传感器作为一种集振动和温度监测于一体的传感器&#xff0c;具备多项优势&#xff0c;因此在工业设备状态监测领域得到广泛应用。 温振一体式传感器基于振动传感器和温度传感器的…