自定义类型:【联合体和枚举】

一.联合体

1.联合体类型的声明

联合体像结构体一样,也是有一个或者多个成员组成,当然也可以不同的类型。但不同的是,比编译器只为最大的成员分配足够的内存空间,所有成员共用同一块内存空间。所以联合体也叫做:共用体。

联合体与结构体最不同的是,给联合体里的一个成员赋值,其他的成员也会随之变化。

联合体的声明其实也跟结构体大体一样

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

其实就是把struct给换成了union。

2.联合体的特点

上面的代码打印出来最终是4。可为什么是4呢?我们来探讨一下

首先,我们先思考一下,我上面说了一个东西就是所有成员共用一块空间。那么我在这个联合体里c和i的地址一样吗?我们来打印测试一下这两个地址是否一样。

其实是一样的。那么我们是不是可以得出一个结论:我们创建的一个成员变量i占了4个字节,这个c占了一个字节,其实i的第一个字节同样也是c的那一个字节。

再来看这个代码

union Un
{char c;int i;
};
#include <stdio.h>
int main()
{union Un u = { 0 };u.i = 0x11223344;u.c = 0x55;return 0;
}

再来看在内存中的存储,我改变了u.c的值,同样这里的44变成了55.

3.联合体大小的计算

想要计算联合体的大小,需要先明白两点

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

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

注意了,联合体的大小是至少是最大成员的大小,可不一定是最大成员的大小,举个例子:

#include<stdio.h>
union Un
{             //类型大小  默认对齐数  对齐数char c[5];//1         8        1int i;    //4         8        4
};
int main()
{union Un u = { 0 };printf("%d", sizeof(u));return 0;
}

打印出来的是8

因为c有5个char类型的元素。直接就占用了5个字节,根据上面的第二点,我们需要对齐到4的倍数,所以就是8.

4.联合体的使用

根据我前面所说的,使用联合体我们是可以节省空间的。

那么假如我们举行了一个游戏,参与游戏的人,获得了礼品兑换的机会。有三种商品我们可以兑换:图书,杯子和衬衫。而每一种商品都有:库存量,价格等其他信息。

还有一些商品的特有属性

图书:书名,作者,页数

杯子:设计

衬衫:设计,颜色,尺寸

如果我想用代码把这些结构写出来,如果不认真思考的话,可能就直接把这些一窝蜂的都写到结构体里去了。

可能写出来是这样的

struct gift_list
{//公共属性int stock_number;//库存量double price;//定价int item_type;//商品类型//特殊属性char title[20];//书名char author[20];//作者int num_pages;//页数char design[30];//设计int color;//颜色int sizes;//尺寸
};

根据我上次说的计算结构体大小的时候,这个占用的内存太多了,而且有一些属性其他的商品根本用不到。我们可以把一些特殊的属性给特殊的物品用,比如书名,作者和页数,这些属性只会给书本使用。那么我们就可以单独把一些单独的属性给列出来,其他有特殊属性的再单独用联合体在一起。

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[30];//设计int color;//颜色int sizes;//尺寸}shirt;}item;
};

在这里有一个联合体里面包含了三个结构体成员,我们把每一件物品的特属性都分别放在了book,mug和shirt里面,前提是当我们在使用其中一个的时候是不会影响其他的两个,这时我们就可以使用联合体的方式来很大程度的节省空间。

5.联合体的小练习

写一个程序来判断当前机器是大端还是小段

#include <stdio.h>
int check_sys()
{union Un{char c;int i;}u;u.i  = 1;return u.c;
}
int main()
{int ret = check_sys();if (ret = 1){printf("是小端\n");}else{printf("是大端");}return 0;
}

可以复制来看一下打印出来的多少。

二.枚举类型

1.枚举类型的声明

所谓枚举,其实就是一一列举的意思。它的关键字是enum。比如三原色:

enum Color
{RED,GREEN,BLUE,
};

这就是把他们一一列举出来,{}里的内容也就是枚举类型的可能取值,也叫做枚举常量。枚举类型也是可以创建变量的,比如:

int main()
{enum Color color=RED;return 0;
}

值得注意的是,枚举内部的成员其实也有数值,我们可以单独打印出来它们的值来看一下。

#include<stdio.h>
enum Color
{RED,GREEN,BLUE,
};
int main()
{enum Color color=RED;printf("%d\n", RED);printf("%d\n", GREEN);printf("%d\n", BLUE);return 0; 
}

最终打印出来的值按顺序分别是0,1,2

我们在主函数里是不能改变这三个值的,因为它们也是常量。但是,我们可以在枚举体的内部改变它们的值:

我们把第二个值改了之后,这里的第二个值和第三个值也随之变化了。

2.枚举类型的优点

1.增加代码的可读性和可维护性

2.和#define定义的标识符相比枚举有类型检查,更加严谨(#define定义的标识符是没有类型可言的,但是枚举是有类型的,比如我给一个enum Color =RED;在c++中就不能写成enum Color =0,其实RED就是0)

3.便于调试,预处理阶段会删除#define定义的符号(在预处理的时候,如果代码里有#define定义的标识符,会直接给替换掉)

4.使用方便,一次可以定义多个常量

5.枚举常量是遵循作用域规则的,枚举声明在函数里,只能在函数里使用

感谢大家的观看,如果有错误,还请大家多多指正。

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

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

相关文章

[Linux初阶]which-find-grep-wc-管道符命令

目录 一.which 二.find a.-name b.-size 三.grep 四.wc 五.管道符(|) 五.总结 一.which 语法格式: which [命令] Linux中的一个个命令,本体上就是一个个的二进制可执行程序(相当于windows中的.exe文件). 在Linux中,一切皆文件. which命令:用于查看指定命令的可执行…

centos 7 安装磐维(PanWeiDB)数据库(单机)

前置环境准备 文件系统环境要求 文件系统环境所要求的扇区必须为512bytes&#xff0c;查看方法如下&#xff1a; [rootdevops-core-highapp3-b-32 ~]#df -h /apps/ [rootdevops-core-highapp3-b-32 ~]#ll /dev/mapper/vg--docker-lvapp [rootdevops-core-highapp3-b-32 ~]#f…

C++命名空间详解

背景 大型程序往往会使用多个独立开发的库&#xff0c;这些库又会定义大量的全局名字&#xff0c;如类、函数和模板等。当应用程序用到多个供应商提供的库时&#xff0c;不可避免地会发生某些名字相互冲突的情况。 多个库将名字放置在全局命名空间中将引发命名空间污染。 传…

dnf手游攻略:如何利用PVP竞技赛季赚取泰拉与金币?

在DNF手游中&#xff0c;PVP竞技赛季是玩家赚取泰拉和金币的重要途径之一。本攻略将介绍如何通过参与PVP竞技赛季来获取丰厚的游戏收益&#xff0c;帮助玩家在游戏中获得更多的经济收益和游戏资源。 一、认识PVP竞技赛季 PVP竞技赛季是DNF手游中的一个重要活动&#xff0c;每个…

FFmpeg将绿幕视频处理成透明视频播放

怎么在网页端插入透明视频呢&#xff0c;之前在做Web3D项目时&#xff0c;使用threejs可以使绿幕视频透明显示在三维场景中&#xff0c;但是在网页端怎么让绿幕视频透明显示呢&#xff1f; 如图上图&#xff0c;视频背景遮挡住后面网页内容 想要如下图效果 之前有使用过ffmpeg…

选择华为HCIE培训机构有哪些注意事项

选择软件培训机构注意四点事项1、口碑&#xff1a;学员和社会人士对该机构的评价怎样&#xff1f; 口碑对于一个机构是十分重要的&#xff0c;这也是考量一个机构好不好的重要标准&#xff0c;包括社会评价和学员的评价和感言。誉天作为华为首批授权培训中心&#xff0c;一直致…

Vue中使用Vuex(超详细)基本使用方法

在vue中使用vuex&#xff0c;不同的vue版本要对应使用不同的vuex&#xff0c;在这里不做详情介绍&#xff0c;想具体了解的&#xff0c;请自行度娘或者必应一下。 在使用vuex之前&#xff0c;我们创建一个新的项目&#xff0c;这里我们使用的是vue的脚手架创建一个vue项目。 …

基于java高校社团招新系统设计与实现

摘要 &#xff1a;大学学生社团的不断壮大发展&#xff0c;让对社团的招新管理越来越重要&#xff0c;如何高效的管理社团&#xff0c;促进社团有效的运行和发展变得尤为关键。学生社团在学生的成长发展过程中有着一定的积极作用&#xff0c;要发挥好社团的优势&#xff0c;管…

机器学习基础——模型评估与选择(部分)

目录 一、前言&#xff1a;误差与拟合 &#xff08;一&#xff09;经验误差 &#xff08;二&#xff09;过拟合、欠拟合 二、评估方法 &#xff08;一&#xff09;评估总体的思路 &#xff08;二&#xff09;如何划分训练集和测试集 1.留出法 2.k折交叉验证 3.自助法 …

Matlab之求直角坐标系下两直线的交点坐标

目的&#xff1a;在直角坐标系下&#xff0c;求两个直线的交点坐标 一、函数的参数说明 输入参数&#xff1a; PointA&#xff1a;直线A上的点坐标&#xff1b; AngleA&#xff1a;直线A的倾斜角&#xff0c;单位度&#xff1b; PointB&#xff1a;直线B上的点坐标&#xf…

Game Audio Programming

音频编程时游戏开发中最容易忽略&#xff0c;学习资源又是很少的环节。接下来&#xff0c;你将和我探索人耳的工作机制。 what is sound? 我们可以解释电视机是如何通过眼睛传递视觉信息的&#xff0c;但却往往无法对听觉信息做出类似的解释。 对声音的科学研究被称为声学&…

Day48:WEB攻防-PHP应用文件上传中间件CVE解析第三方编辑器已知CMS漏洞

目录 PHP/ASP-中间件-上传相关-IIS&Apache&Nginx(解析漏洞) IIS Apache Nginx PHP-编辑器-上传相关-第三方处理引用 PHP-CMS源码-上传相关-已知识别到利用 知识点&#xff1a; 1、PHP-中间件-文件上传-CVE&配置解析 2、PHP-编辑器-文件上传-第三方引用安全 3…

Vue——案例01(查询用户)

一、案例实现页面 二、案例实现效果 1. 查询效果 2. 年龄升序 3. 年龄降序 4. 原顺序 三、案例实现思路 1. 定义界面所需标签样式 <div id"app"><h2>查询用户:</h2><input type"text" placeholder"请输入名字"/><b…

01---java面试八股文——mybatis-------10题

1、什么是MyBatis Mybatis是一个半ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;它内部封装了JDBC&#xff0c;开发时只需要关注SQL语句本身&#xff0c;不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。程序员直接编写原生态sql&#xff0c…

superset config.py路徑

superset config.py路徑 1.路徑 cd /opt/module/miniconda3/envs/superset/lib/python3.9/site-packages/superset2.找到config.py路徑

LeetCode146:LRU缓存

leetCode&#xff1a;146. LRU 缓存 题目描述 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类&#xff1a; LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存 int get(int key) 如果关键字 key 存在于缓存中&#x…

Java项目:80 springboot师生健康信息管理系统

作者主页&#xff1a;源码空间codegym 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 系统的角色&#xff1a;管理员、宿管、学生 管理员管理宿管员&#xff0c;管理学生&#xff0c;修改密码&#xff0c;维护个人信息。 宿管员…

Elasticsearch 和 Kibana 8.13:简化 kNN 和改进查询并行化

作者&#xff1a;Gilad Gal, Tyler Perkins, Srikanth Manvi, Aris Papadopoulos, Trevor Blackford 在 8.13 版本中&#xff0c;Elastic 引入了向量搜索的重大增强&#xff0c;并将 Cohere 嵌入集成到其统一 inference API 中。这些更新简化了将大型语言模型&#xff08;LLM&a…

深度学习pytorch——卷积神经网络(持续更新)

计算机如何解析图片&#xff1f; 在计算机的眼中&#xff0c;一张灰度图片&#xff0c;就是许多个数字组成的二维矩阵&#xff0c;每个数字就是此点的像素值&#xff08;图-1&#xff09;。在存储时&#xff0c;像素值通常位于[0, 255]区间&#xff0c;在深度学习中&#xff0…

《QT实用小工具·四》屏幕拾色器

1、概述 源码放在文章末尾 该项目实现了屏幕拾色器的功能&#xff0c;可以根据鼠标指定的位置识别当前位置的颜色 项目功能包含&#xff1a; 鼠标按下实时采集鼠标处的颜色。 实时显示颜色值。 支持16进制格式和rgb格式。 实时显示预览颜色。 根据背景色自动计算合适的前景色…