自定义类型之枚举和联合

news2024/10/5 20:27:49

该文章将详细介绍除结构体外的另外两种自定义类型--------枚举类型与联合类型。

  • 1.枚举
    • 1.1枚举类型的定义
    • 1.2枚举的优点
    • 1.3枚举的使用
  • 2.联合(共用体)
    • 2.1联合类型的定义
    • 2.2联合的特点
    • 2.3联合大小的计算

1.枚举

枚举顾名思义就是------一一列举。
把所有可能的取值一一列举出来。
比如我们现实生活中:

星期一到星期天可以一一列举。
性别男女可以一一列举
月份12个月可以一一列举

这里就可以使用枚举了

1.1枚举类型的定义

enum Day//星期
{
	Mon,
	Tues,
	Wed,
	Thur,
	Fri,
	Sat,
	Sun
};
enum Sex//性别
{
	MALE,
	FEMALE
};
enum Color//颜色
{
	RED,
	GREEN,
	BLUE
};

以上的 enum Day ,enum Sex,enum Color,都是枚举类型,它们是属于类型的,跟int ,char ,short,,等等是一样,只不过是自己定义的。{ }里面的是枚举类型的可能取值,叫做枚举常量
注意这些不是成员,是枚举类型的可能取值。
这些取值是都有值的,默认是从0开始,依次往下递增1,当然也可以在定义的时候给它进行初始化赋值。还有赋值后它就不能再改变了,因为它是‘ 常量 ’。

在这里插入图片描述
也可以在定义的时候初始化赋值。

enum Color//颜色
{
	RED=5,
	GREEN=8,
	BLUE=4
};

1.2枚举的优点

为什么要使用枚举?
我们可以用#define 定义常量,为什么要用枚举?
枚举的优点:

1. 增加代码的可读性和可维护性
2. 和#define 定义的标识比较枚举定义的标识,枚举有类型检查,更加严谨
3. 防止了命名污染(封装)
4. 可以调试观察,便于调试
5. 使用方便,一次可以定义多个常量

1.3枚举的使用

enum Color//颜色
{
	RED=5,
	GREEN=8,
	BLUE=4
};
int main()
{
	enum Color col = BLUE;//枚举变量col只能由枚举常量赋值,才不会出现类型差异
	//如果这样写: RED=3;可以吗?
	return 0;
}

2.联合(共用体)

2.1联合类型的定义

联合也是一种特殊的自定义类型
这种类型定义的变量也包含一系列的成员,特点是这些成员公用同一块空间(所有联合也叫共用体)
比如:

//联合类型的声明
union UN
{
	char c;
	int i;
};
//联合类型的定义
union UN un;
//联合成员的访问    (un.c)   (un.i)
//计算联合类型变量的大小
printf("%d\n", sizeof(un));

2.2联合的特点

1.联合的成员是共用同一块内存空间的,这样的一个联合变量的大小,至少是最大成员的大小(因为联合至少要有能力保存最大的成员)
2.联合的成员之间不能同时使用,使用其中一个,其他都不能使用。

union UN
{
	char c;//1字节
	int i;//4字节
};
union UN un;
int main()
{
	printf("%p\n", &un);
	printf("%p\n", &(un.c));
	printf("%p\n", &(un.i));
	return 0;
}
//上面输出结果相同吗?为什么呢?

在这里插入图片描述
说明char c,与int i,共用同一个地址,int i 4个字节中,c占用了一个1字节。
在这里插入图片描述

union Un
{
 int i;
 char c;
};
union Un un;
//下面输出的结果是什么?
un.i = 0x11223344;
un.c = 0x55;
printf("%x\n", un.i);

在这里插入图片描述
i,和c同时都使用了,都给各自赋值后,原来自己的值就会发现变化,因为它们共用同一块空间
在这里插入图片描述

2.3联合大小的计算

  • 联合的大小至少是最大成员的大小
  • 当最大成员大小不是最大对齐数的整数倍时候,就要对齐到最大对齐的整数倍。
    例如:
union Un1
{
	char c[5];
	int i;
}un1;
union Un2
{
	short c[7];
	int i;
}un2;
int main()
{
	//下面输出大小是多少?
	printf("%d\n", sizeof(un1));
	printf("%d\n", sizeof(un2));
	return 0;
}

结果:
在这里插入图片描述
解析:

union Un1
{
	char c[5];//这里大小至少是最大成员5,但最大对齐是4,而5不是4的倍数,所有答案只能是8
	int i;
}un1;
union Un2
{
	short c[7];//这里大小至少是最大成员14,而最大对齐数是4,而14不是4的倍数,所有答案只能是16了
	int i;
}un2;

还有一个与之相关的知识:利用联合的知识怎么证明当前机器是大段存储还是小段存储?
解1:

int check()//利用char类型指针解引用访问1个字节,如果数据在内存中倒着存,那访问1字节就能访问到1
{
	int i = 1;
	int* p = &i;
	return *((char*)p);
}
int main()
{
	int ret=check();
	if (ret == 1)
	{
		printf("小段\n");
	}
	else
		printf("大段\n");
	return 0;
}

解2:

int check()
{
	union Un
	{
		char c;
		int i;
	}un;
	un.i = 1;
	return un.c;//利用联合共用相同空间,给i赋值1,那c也存着i的数据,如果小段,那么c就是1

}
int main()
{
	int ret=check();
	if (ret == 1)
	{
		printf("小段\n");
	}
	else
		printf("大段\n");
	return 0;
}

结果:
在这里插入图片描述

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

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

相关文章

ADAS HiL系统测试方案

1、什么是ADAS ADAS(Advanced Driving Assistance System)也就是高级驾驶辅助系统,是无人驾驶的过渡。 ADAS利用安装在车上的各式各样传感器(毫米波雷达、激光雷达、单\双目摄像头以及卫星导航),在汽车行驶…

[前端笔记——CSS] 12.处理不同方向文本

[前端笔记——CSS] 12.盒模型背景与边框1.书写模式2.书写模式、块级布局和内敛布局3.逻辑属性和逻辑值1.书写模式 CSS 中的书写模式是指文本的排列方向是横向还是纵向的。writing-mode 属性使我们从一种模式切换到另一种模式。例如,我们使用writing-mode: vertical…

stack、queue、priority_queue

容器适配器 适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结),该种模式是将一个类的接口转换成客户希望的另外一个接口。 其中stack和queue都是容器适配器,其中stack可以封装vector、list以及我们…

ffmpeg无损裁剪、合并视频

我用的版本是 ffmpeg version git-2020-06-23-ce297b4 官方文档 https://ffmpeg.org/ffmpeg-utils.html#time-duration-syntax 时间格式 [-][HH:]MM:SS[.m...] 或 [-]S[.m...][s|ms|us]裁剪视频 假设需要裁剪视频aaa.mp4,第5秒到第15秒 ffmpeg -ss 5 -to 15 -i…

使用gazebo对scara机械臂进行仿真

本文主要介绍如何仿真一个scara机械臂,以及在网上看了一些项目以后,有了一些感想,不想看的可以直接跳到机械臂部分。 目录感想(自己的理解,不一定对。)Scara机械臂的开发运动学计算如何使用机械臂工作图一个例子: 在start_pose抓起…

【Hadoop】MapReduce分布式计算实践(统计文本单词数量)

文章目录1. 前言2. Mapper代码3. Reducer代码4. Main代码5. 项目打包6. Hadoop运行7. 运行结果查看7.1 输出文件查看7.2 日志查看1. 前言 在博客【Hadoop】MapReduce原理剖析(Map,Shuffle,Reduce三阶段)中已经分析了MapReduce的运…

ASP.NET Core+Element+SQL Server开发校园图书管理系统(二)

随着技术的进步,跨平台开发已经成为了标配,在此大背景下,ASP.NET Core也应运而生。本文主要基于ASP.NET CoreElementSql Server开发一个校园图书管理系统为例,简述基于MVC三层架构开发的常见知识点,前一篇文章&#xf…

Linux C编程一站式学习笔记6

Linux C编程一站式学习笔记 chap6 循环结构 文章目录Linux C编程一站式学习笔记 chap6 循环结构一.while语句递归 VS 循环函数式编程(Functional Programming) & 命令式编程(Imperative Programming)无限递归 & 无限循环习…

光流估计(二) FlowNet 系列文章解读

在上篇文章中,我们学习并解了光流(Optical Flow)的一些基本概念和基本操作,但是传统的光流估计方法计算比较复杂、成本较高。近些年来随着CNN卷积神经网络的不断发展和成熟,其在各种计算机视觉任务中取得了巨大成功&am…

docker-基础实战第六课镜像挂载

镜像挂载: docker run --namemynginx -d --restartalways -p 8088:80 -v /usr/local/docker/data/html:/usr/share/nginx/html:ro nginx访问403 原因: /usr/local/docker/data/html 没有创建index.html 需要创建目录并且创建index.html docker命令补充: 如果有一…

向QAbstractItemView子类如:QTreeView、QTableView等子项单元格插入窗体小部件的功能实现(第1种方法)

1.前言 工作中经常会遇到这样的需求:向QAbstractItemView子类如QTreeView、QTableView单元格插入窗体小部件,如:进度条、按钮、单行编辑框等。下面链接的系列博文就是讲解如何实现该功能的。《向QAbstractItemView子类如:QTreeView、QTableVi…

Android音频播放有杂音?原来是这个JAVA API接口惹的祸

最近在调试一个基于十年前Android版本的多媒体应用软件时,遇到了音频播放的问题,这里记录问题的发现、分析和处理过程。 有人可能会好奇,十年前的Android版本是什么版本?大家可以去Google网站上查查,就是目前Android网…

Android深入系统完全讲解(40)

调试 C 代码 15.1 改成 C 写法 这个没啥必要,但是对 C 比 C 情谊深的我,把它修改了。下面是修改的一部分代码, 把 C 的写法,改成 C 的,同时修改引入头文件。 jstring Java_hellojni_codegg_com_hellojni_MainActivity_…

Java基础41 面向对象(高级)

面向对象(高级)一、类变量和类方法1.1、static (类变量)1.1.1 关于static的存放位置1.1.2 类变量使用细节及注意事项1.2、类方法1.2.1、类方法使用细节及注意事项二、main方法2.1、深入理解main方法三、代码块3.1、代码块的基本介…

19.6、Javaweb_案例旅游路线收藏功能

旅游线路收藏功能 分析 判断当前登录用户是否收藏过该线路 当页面加载完成后,发送ajax请求,获取用户是否收藏的标记 根据标记,展示不同的按钮样式 编写代码 后台代码 RouteServlet: package cn.itcast.travel.web.servlet;…

【Typescript学习】使用 React 和 TypeScript 构建web应用(四)useReducer、扑街了的分区功能【完结了】

教程来自freecodeCamp:【英字】使用 React 和 TypeScript 构建应用程序 跟做,仅记录用 其他资料:https://www.freecodecamp.org/chinese/news/learn-typescript-beginners-guide/ 作者提供的源码https://github.com/piyush-eon/react-typescr…

机器学习【西瓜书/南瓜书】--- 第四章决策树

一、决策树理论分析 1.1 通俗理解 决策树是一种非常经典的机器学习算法,通俗理解的话我们可以举一个例子,比如现在别人要找你借钱,那么按照首先是不是要判断你和他的关系如何?如果关系不好,我就直接拒绝他。如果关系很好&#…

Python机器学习:一元回归

→\rightarrow→回归效果评价 🌕 一元回归 一元回归主要研究一个自变量和一个因变量之间的关系,而这个自变量和因变量之间的关系又可分为线性回归和非线性回归。 ⭐️ 一元线性回归分析两个变量之间的线性关系,如ykxbykxbykxb中xxx和yyy就是…

深度学习笔记:神经网络的学习(1)

机器学习的核心在于从数据中提取规律和特征,并用于分类或预测。对于识别手写数字,如果人工设计一个识别算法逻辑是十分困难的。一种方法是任务在数据中提取更重要的特征量,然后利用机器学习算法如SVM或KNN。而神经网络的方法则是完全由机器自…

ISIS的3级别(level-1、level-2、level-1-2)4大类(IIH、LSP、CSNP、PSNP)9小类与邻接关系建立LSP交互过程介绍

2.2.0 ISIS 4种报文类型IIH、LSP、CSNP、PSNP、邻居建立过程、交互LSP过程 ISIS的3级别4大类9小类 ISIS拥有3种级别的路由器,分别是level-1、level-2、level-1-2。 不同级别之间进行交互的报文也是有所区别的,常规的ISIS报文分有4大类:IIH、…