C语言自定义类型联合体和枚举

union

n.工会;联邦,联盟;协会,俱乐部;联合,合并;

结婚,婚姻;美利坚合众国(the Union);

(数)并,并集;联管节,接头;(印度次大陆)村落联合体;

<英,史>教区联合济贫组织;旗帜上象征国家统一的部分;混纺织物

enumerate

v.列举;枚举;计算

stock

n.库存,存货;股票,股份;原料;

v.备有,存有;摆满,供应;为(枪等火器)装枪托;出新芽

adj.老一套的,陈腐的;(商店)库存的,常备的;(有关)电影资料镜头的

1.联合体

定义

联合体又称共用体,和结构体类似作用都是将不同类型的变量进行集成,从而得到一个新的类型变量,不同的地方就在存储方式上,结构体是为所有类型数据都分配空间,而联合体所有类型数据共用一块空间,且空间的大小为这些类型中所占空间最大类型的大小。

声明方式

union  union_name
{number_var;number_var;...
};
  • union                   创建联合体类型时的关键字        
  • union_name        union_name联合体类型的名字
  • number_var         number_varible联合体内的成员变量

 注意:

  1. 联合体类型的成员变量不能被初始化
  2. union union_name这两个合在一起才被称为联合体类型。
  3. 联合体的声明一定在使用前进行声明不能在后声明。
  4. 联合体是成员变量共用一块空间,成员变量的值就会随着其他成员的改变而改变。

例子:

typedef重命名

typedef union S //定义的联合体前加上typedef关键字
{char a;int b;
}S;//在定义完后面加上重新命名的名字
struct Stu S1;//使用struct定义的名字创建变量
Stu S2;//使用typedef重命名的名字创建变量
//不在声明时重命名
typedef union S S;//typedef关键字+原名+新名字;

特殊声明:

struct    //不声明结构体类型名字
{char a;int b;
}S1;//创建结构体变量
  • 这种在声联合体时不声明联合体类型名,而在声明后接着创建联合体变量的操作就称为联合体的匿名声明。
  • 对于这种没有将联合体类型名的联合体,就意味着不能通过联合体类型来创建联合体变量,这种只能使用它后面的联合体变量,可以称为一次性联合体。

变量创建

A.在声明时

B.通过结构体类型

存储形式

        联合体是所有成员变量共用同一块空间,且空间的大小为最大成员变量的大小。

使用方式

访问成员操作:

A.操作符' . '

结构体变量名.成员变量名

union_name.number_var_name1;
S1.b = 21;

通过结构体类型变量访问 

B.操作符" -> "

结构体指针->成员变量名

union_piont_name.number_var_name1
union S* p;//联合体指针
p->b = 21;

初始化操作:

        联合体的初始化与结构体不同,结构体的每个成员都有单独的空间,就意味着每个成员都能初始化,而对于联合体则是共用同一块空间,每个成员变量的变化都会影响到其成员,所以通常则是想用哪个成员时,就单独给它赋值,而不是都拿出来赋值,那没意义

常见例子

商品的属性:

        不同的商品有相同的属性和不同的属性,比如衣服,书籍和手机,他们共有的属性就是价格,库存量等等;而对于衣服单独具有的属性就是尺码,颜色等等,对于书籍就是书名,作者等等,对于手机就是内存,处理器等等。

        那么想要将不同商品进行封装,那么就要将相同的属性和不同的属性进行封装,而不同的属性只有特定的商品才能,封装所有不同的属性就会使得结构体的内存大小非常大,这时就可以使用联合体来将不同的属性进行封装,节省空间。

//使用结构体封装商品
struct Cmd
{//共有的属性int price;//价格int stock;//库存量union{struct{int size;//尺寸char color[10];//颜色}clothes;struct{char book_name[20];//书名char author[20];//作者}book;struct{char memory[20];//内存char processor[20];//处理器};}item;};

大小端字节序判断:

2.枚举

定义

        枚举是一些字符常量的集合,这些字符常量本质的类型都是int类型,就是一个int数值绑定了一个枚举常量有了另外一个名字,比如星期的一一例举,三原色等等。

声明方式

enum enum_name
{enum_elements 1,enum_elements 2,...enum_elements n //枚举元素
};
  • enum                        枚举类型创建的关键字
  • enum_name             枚举类型的名字
  • enum_elements       枚举元素,为字符常量

注意:

  1. 枚举元素的表面上是字符常量,实际上就是整形数据的别名
  2. 给枚举元素初始化,那么默认第一个元素为0,往后依次增加
  3. 若给枚举元素初始化,该元素后面的元素的整形值依次增加
  4. 枚举元素之间是由逗号' , '隔开的,且最后一个后面没有逗号。
  5. 同一个枚举类型中不得含有相同字符的枚举元素。
  6. 枚举型是预处理指令#define的替代,宏是在预处理阶段将名字替换成对应的值,枚举则是在编译阶段将名字替换成对应的值。【补充】

例子:

typedef重命名 

typedef enum enum_name//在声明的关键字前加上重命名关键字
{enum_elements 1,enum_elements 2,...enum_elements n //枚举元素
}new_enun_name;//在声明完后加上新的名字

变量创建

A.在声明时

enum enum_name{enum_elements 1,enum_elements 2, ...enum_elements n}枚举变量名;

B.通过结构体类型

enum enum_name{enum_elements 1,enum_elements 2, ...enum_elements n};//声明

enum enum_name 枚举变量名;

存储形式

        枚举类型在内存中的存储类似于联合体,枚举元素共用一块空间,也就是一个枚举元素的大小,而每个枚举元素事实上就是int类型,就是4个字节,所以对于任何枚举类型的空间大小都是4个字节。

使用方式

  1. 每个枚举类型的枚举元素事实上就是一个列表,而定义的枚举变量就是在这个列表中取值。
  2. 对C而言,可以给枚举变量赋值整形数值,而对于C++而言则更加严格,则不能。
  3. 枚举类型的变量只能使用该枚举类型中定义的枚举元素进行赋值,不能赋值枚举元素以外的值。

枚举的优点

【补充】

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

【转载】


本章内容结束,下章见,拜拜!!! 

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

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

相关文章

交互式QGraphicsView(平移/缩放/旋转)

一 简述 Graphics View提供了一个平台&#xff0c;用于大量自定义 2D 图元的管理与交互&#xff0c;框架包括一个事件传播架构&#xff0c;支持场景 Scene 中的图元 Item 进行精确的双精度交互功能。Item 可以处理键盘事件、鼠标按下、移动、释放和双击事件&#xff0c;同时也…

福昕阅读器 PDF 文档基本操作

福昕阅读器 PDF 文档基本操作 References 转至 PDF 顶部 快捷键&#xff1a;Home. 转至 PDF 顶部 快捷键&#xff1a;End. 打开超链接 文本选择工具 -> 手形工具 (Hand Tool) -> 点击超链接 福昕阅读器 同时在多个窗口中打开多个文件 文件 -> 偏好设置 -> 文…

高中信息技术教资刷题笔记_选择题篇

1.信息技术基础 位与字节的换算 模2除法运算 网页保存 进制之间的计算 教你快速学会二进制、十进制、十六进制之间的转换 - 知乎 (zhihu.com) 原码、补码、反码计算 物联网技术 位运算 按位与&#xff1a;同位置为1&#xff0c;则为1&#xff0c;其他都是0按位或&#xff1a;有…

MRC是谁?- 媒体评级委员会 Media Rating Council

在在线广告的世界里&#xff0c;有许多不同的技术和实践用于提供和衡量广告。对于广告商、出版商和营销人员来说&#xff0c;了解这些技术是如何工作的以及如何有效使用这些技术很重要。在这方面发挥关键作用的一个组织是媒体评级委员会&#xff08;MRC&#xff09;。 1. 了解…

Android 项目新建问题总结

title: Android 项目新建问题总结 search: 2024-03-24 tags: “#Android 项目新建问题总结” Android 项目新建问题总结 一、gradle 项目每次都自动下载依赖包到C盘 背景&#xff1a;idea 首次打开一个 gradle 项目&#xff0c;都会在 C 盘下载项目所需的依赖包&#xff0c;但…

Automatic Prompt Engineering

让大模型自己生成prompt&#xff0c;生成提示&#xff08;prompt&#xff09;存在两种不同的操作方式。第一种方式是在文本空间中进行&#xff0c;这种提示以离散的文本形式存在。第二种方式是将提示抽象成一个向量&#xff0c;在特征空间中进行操作&#xff0c;这种提示是抽象…

React高阶组件(HOC)

高阶组件的基本概念 高阶组件&#xff08;HOC&#xff0c;Higher-Order Components&#xff09;不是组件&#xff0c;而是一个函数&#xff0c;它会接收一个组件作为参数并返回一个经过改造的新组件&#xff1a; const EnhancedComponent higherOrderComponent(WrappedCompo…

Gitee删除自己本地仓库

1、打开自己的本地仓库 2、点击管理 3、选择删除仓库 4、将□的内容复制到⭕里

mysql 存储引擎 基本介绍

目录 一 存储引擎概念介绍 &#xff08;一&#xff09;存储引擎概念 &#xff08;二&#xff09;MySQL常用的存储引擎 &#xff08;三&#xff09;存储引擎运作方式 二 MyISAM 存储引擎介绍 &#xff08;一&#xff09; MyISAM 存储引擎特点 1&#xff0c;不支持…

基于51单片机数控直流电压源proteus仿真LCD显示+程序+设计报告+讲解视频

基于51单片机数控直流电压源proteus仿真LCD显示( proteus仿真程序设计报告讲解视频&#xff09; 仿真图proteus7.8及以上 程序编译器&#xff1a;keil 4/keil 5 编程语言&#xff1a;C语言 设计编号&#xff1a;S0072 讲解视频 基于51单片机数控直流电压源proteus仿真程序…

博途建立S7-1200PLC与HMS AB7013Profinet通讯

1、新建一个博图项目1200PLC .CPU 1214C ACDC/RIY 6ES7 214-1BG31-0x80 2、安装GSD文件 Install general station description fle (GsD) GSDMLV2.3-HMS-ABC PROFINET GSD 3、连接PLC 4、在线访问 5、增加访问子网络 6、设定IP地址 7、增加AnyBus模块 8、设定模块的IP地址及…

大语言模型(Large Language Model,LLM)简介

1. 什么是大语言模型 它是一种基于深度学习的人工智能模型&#xff0c;它从大量来自书籍、文章、网页和图像等来源的数据中学习&#xff0c;以发现语言模式和规则&#xff0c;如处理和生成自然语言文本。通常&#xff0c;大语言模型含数百亿&#xff08;或更多&#xff09;参数…

Spring Cloud Gateway Server MVC

之前你如果要用spring cloud gateway &#xff0c;就必须是webflux 的&#xff0c;也就是必须是异步响应式编程。不能和spring mvc 一起使用。现在spring cloud 新出了一个可以不用webflux的gateway。 具体使用mvc的gateway步骤如下 普通的Eureka Client的项目 如果你只是想测…

Qt程序可执行文件打包

目录 一、新建一个目录二、命令行2.1 添加临时变量2.2 打包命令 三、添加动态库四、普通 Qt 项目打包 Qml 项目打包 笔者写的python程序打包地址&#xff08;https://blog.csdn.net/qq_43700779/article/details/136994813&#xff09; 一、新建一个目录 新目录(例如test)用以…

超高并发下Redis热点数据风险破解

1 介绍 作者是互联网一线研发负责人,所在业务也是业内核心流量来源,经常参与 业务预定、积分竞拍、商品秒杀等工作。 近期参与多场新员工的面试工作,经常就 『超高并发场景下热点数据』 可用性保障与候选人进行讨论。 本文聚焦一些关键点技术进行讨论,并总结一些热点场景…

vscode的一些技巧

技巧1&#xff1a;调试时传参数 在launch.json的configuration中"pwd"或者"program"选项之后添加如下选项&#xff1a; “--args”:["参数1", "参数2", ..., "参数3] 参数之间使用逗号隔开 技巧2&#xff1a;断点 普通断点使…

网络协议栈--传输层--UDP/TCP协议

目录 本节重点一、再谈端口号1.1 再谈端口号1.2 端口号范围划分1.3 认识知名端口号(Well-Know Port Number)1.4 回答两个问题1.5 netstat1.6 pidof 二、UDP协议2.1 UDP协议段格式2.2 UDP的特点2.3 面向数据报2.4 UDP的缓冲区2.5 UDP使用注意事项2.6 基于UDP的应用层协议2.7 UDP…

生产力工具|安装更新R软件(R、studio)

内容介绍&#xff1a; 安装R软件&#xff1a; 下载 R X64 3.5.1: 访问官方R网站 https://cran.r-project.org/。选择适合Windows版本的安装包。将安装包下载到您的计算机。 本地安装: 运行下载的“R-3.5.1-win.exe”文件。按照安装向导&#xff0c;选择安装路径&#xff0c;取消…

Day08 Java复习8 Spring MVC概念

Day09 Java复习9 Spring MVC spring mvc 的核心组件是什么&#xff1f; DispatcherServlet 1.JAVA 和Spring 、Spring Boot 、Spring MVC的关系 你要举办一个生日派对&#xff0c;而且你希望它既特别又好玩。Java就像是举办派对的地方&#xff0c;Spring、Spring Boot和Spri…

20240319-图论

图论练习题目 拓扑排序深度优先搜索方法广度优先搜索方法 无向无权图无向有权图有向无权图 利用广度优先搜索算法有向有权图 带排序的广度优先算法/dijkstra最小生成树prims算法Kruskals Algorithm 最小割 min-cut二分图 Bipartite Graph 队列例题1 所有可能的路径例题2 岛屿数…