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. 枚举常量是遵循作用域规则的,枚举声明在函数内,只能在函数内使用。

【转载】


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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Request请求参数----中文乱码问题

一: GET POST获取请求参数: 在处理为什么会出现中文乱码的情况之前, 首先我们要直到GET 以及 POST两种获取请求参数的不同 1>POST POST获取请求参数是通过输入流getReader来进行获取的, 通过字符输入流来获取响应的请求参数, 并且在解码的时候, 默认的情况是 ISO_885…

【MySQL】InnoDB引擎

逻辑结构 InnoDB存储引擎逻辑结构如图所示&#xff1a; Tablespace&#xff1a;表空间&#xff0c;一个数据库可以对应多个表空间。数据库中的每张表都有一个表空间&#xff0c;用来存放表记录、索引等数据。 Segment&#xff1a;段&#xff0c;表空间中有多个段&#xff0c…

通过dbeaver链接dm8数据库

一、环境说明 windows 11 vmware 17 ubuntu 22 tt:~$ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 22.04.3 LTS Release: 22.04 Codename: jammytt:~$ docker info Client:Version: 24.0.5Context: d…

【Web】NKCTF 2024 个人wp(部分)

目录 my first cms 全世界最简单的CTF attack_tacooooo 属实太菜了&#xff0c;3/4 my first cms 一眼搜版本2.2.19 CVE -CVE-2024-27622 GitHub - capture0x/CMSMadeSimple 访问/admin/login.php 爆出弱口令&#xff0c;后台登录 admin Admin123 Extensions > User D…

华为OD机试 - 打印任务排序 - 队列(Java 2024 C卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述1、输入2、输出3、说明 四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2024C卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&a…

io流的学习4

字符缓冲流 原理&#xff1a;底层自带了长度为8192的缓冲区提高性能。 import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException;public class BufferedStringdemo01 {public static void main(String…

Springboot实现合并单元格的excel文件导入到数据库(多模块)

最近做项目的时候一直在遇到excel导入导出的问题&#xff0c;本篇博文也是为了记录我这几天的血泪史&#xff0c;并做以记录&#xff0c;希望各位看完之后能有所收获。 以下是我excel文档里面的具体内容&#xff1a; excel文件中的编码信息属于另外一张表&#xff0c;所以以下…

基于VS code 实现Java前后端打通—基础—使用Springboot+postgreSql+mybatis+Navicat

前言&#xff1a; 作者学习webjava后的而总结&#xff0c;总的流程概括就是先使用springboot创建项目&#xff0c;在application.properties中完成相应的postgreSql和mybaits的环境配置和.xml文件中dependecy依赖配置&#xff0c;entities实现数据表的类型模板&#xff0c;分别…

【机器学习】包裹式特征选择之序列前向选择法

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;机器学习 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进…

php 快速入门(一)

一、配置系统环境 1.1 安装软件 1、安装php的开发软件&#xff1a;phpstorm 在这个软件中写代码 2、安装php的运行软件&#xff1a;phpstduy 写好的php程序需要放到phpstduy中&#xff0c;用户才能访问和测试 安装过程注意事项&#xff1a;安装的路径中不能有空格和中文字符&…

day6:STM32MP157——串口通信实验

使用的是cortex A7内核 【串口通信的工作原理】 本次实验使用的是uart4的串口&#xff0c;分别使用了uart4_tx和uart4_rx两个引脚。根据板子的原理图我们可以知道&#xff0c;他们分别对应着芯片的PG11和PB2 从引脚名字也可以知道使用了GPIO口&#xff0c;所以本次实验同样需…

MCGS学习——用户管理

用户管理介绍 用户管理主要是为了实现触摸屏的安全操作&#xff0c;工业过程控制中&#xff0c;应该尽量避免由于人为的误操作所引发的故障或事故&#xff0c;而某些失误带来的后果是致命的&#xff1b;通过用户管理严格限制各类操作的权限&#xff0c;使不具备操作资格的人员…

软考高级:架构与中间件技术-软件复用概念和例题

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;大厂高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《Effective Java》独家解析》专栏作者。 热门文章推荐&am…

CHAT~(持续更新)

CHAT&#xff08;持续更新&#xff09; 实现一个ChatGPT创建API设计页面布局业务操作技术架构 编码其他 实现一个ChatGPT 创建API 最简单也最需要信息的一步 继续往下做的前提 此处省略&#xff0c;想要获取接口创建方式联系 设计 页面布局 按照官网布局 业务操作 注册登…

Linux 进程通信:匿名管道、实现进程池

目录 一、进程间通信 1、 为什么需要进程通信 2、发展和分类 二、管道 1、概念 2、特点 2、复制并共享 3、用fork来共享管道原理 4、站在文件描述符角度-深度理解管道 5、站在内核角度-管道本质 三、匿名管道 1、概念 2、创建 3、snprintf 4、父子进程中进行单…

抽取CLOB字段中XML的特定元素的VALUE值

在ORACLE数据库中&#xff0c;有时XML文件会被保存在CLOB字段中。 这时候&#xff0c;若是我们要获取此字段XML中特定元素的VALUE值&#xff0c;就需要用到xmltype 这个函数。 如下面的 XML文件&#xff0c;保存在 TABLE_A 的CLOB_K 字段&#xff0c;若是我们要获取其中的 Y…

onnx | onnx-simplifier安装和使用

安装&#xff1a; pip install -i https://pypi.douban.com/simple onnx-simplifierpip install -i http://mirrors.aliyun.com/pypi/simple onnx-simplifier 使用&#xff1a; python -m onnxsim face.onnx face_sim.onnx

Unity Canvas的三种模式

一、简介&#xff1a; Canvas的Render Mode一共有三种模式&#xff1a;Screen Space -OverLay、Screen Space-Camera、World Space Screen Space - Overlay&#xff08;屏幕空间 - 覆盖&#xff09;&#xff1a; 这是最简单的 Canvas 渲染模式。UI 元素在这个模式下将渲染在屏…

Oracle参数文件详解

1、参数文件的作用 参数文件用于存放实例所需要的初始化参数&#xff0c;因为多数初始化参数都具有默认值&#xff0c;所以参数文件实际存放了非默认的初始化参数。 2、参数文件类型 1&#xff09;服务端参数文件&#xff0c;又称为 spfile 二进制的文件&#xff0c;命名规则…

PostgreSQL11 | Windows系统安装PostgreSQL

本教程选取与参考书籍《PostgreSql11 从入门到精通》&#xff08;清华大学出版社&#xff09;的11大版本最新小版本11.22的安装作为教程案例 下载 下载PostgreSQL installer 下载到本地 安装 运行安装引导器 中国地区语言选项&#xff08;暂时&#xff09; Chinese(Simplifie…