C++新经典03--共用体、枚举类型与typedef

news2024/9/21 15:54:56

共用体

共用体,也叫联合,有时候需要把几种不同类型的变量存放到同一段内存单元,例如,把一个整型变量、一个字符型变量、一个字符数组放在同一个地址开始的内存单元中。这三个变量在内存中占的字节数不同,但它们都从同一个地址开始,换句话说就是几个变量会互相覆盖。这种几个变量共同占用同一段内存的存储数据的方式,就叫共用体,这些变量也被称为共用体成员变量(简称“成员”)。
看一看共用体定义的一般形式:
在这里插入图片描述
共用体因为成员占用同一段内存,所以占用的内存大小等于占用内存最大的成员所占的内存大小,而不是每个成员所占内存大小之和。
在这里插入图片描述

在这里插入图片描述

有几点说明:
(1)共用体变量的引用方式。和结构体很类似,不能直接引用共用体变量,只能引用共用体变量中的成员,如a.cname、a.carnum,要知道,a对应的内存空间中有好几种不同类型的成员,每个成员占的内存大小都可能不同,所以必须明确写明引用的成员。
(2)共用体变量的特点。同一段内存中存放几个不同类型的成员,但每一个瞬间只能存放其中一个,换句话说,每个瞬间只能有一个成员起作用,其他成员不起作用。
程序中最后给哪个成员赋值,哪个成员就起作用。看如下代码:
在这里插入图片描述
所以,使用共用体变量时必须时刻注意当前存放在其中的数据,明确知道哪个成员当前正在起作用。

(3)共用体变量地址和其成员的地址都相同。也就是说,&a、&a.carnum、&a.cartype、&a.cname所代表的首地址都相同,共用体变量名也代表共用体变量的首地址,这一点与数组名代表数组首地址的说法类似。
(4)共用体变量不能在定义的时候给所有成员都进行初始化。看如下代码:
在这里插入图片描述
但是在定义的时候初始化第一个成员是允许的。看如下代码:
在这里插入图片描述

枚举类型

如何理解枚举类型?例如有4种颜色,分别是红色、绿色、蓝色、黄色,现在想表示这4种颜色,可以约定用数字来表示,如约定0表示红色,1表示绿色,2表示蓝色,3表示黄色,这当然可以,但0、1、2、3这样的数字看起来很不直观,如果能够用一些英文单词如用Red表示红色,Green表示绿色,Blue表示蓝色,Yellow表示黄色,更直观、更容易让人看懂,此时枚举类型就能发挥作用。看看怎样用枚举类型来定义这些颜色,代码如下:

enum color	//color是枚举类型名
{
	Red,	//值
	Green,
	Blue,
	Yellow
};

这样就定义了一个名字叫作color的枚举类型,因为这是个类型,定义完之后,就可以使用这个类型了。看看如下代码:
在这里插入图片描述

有几点说明:(1)枚举,就是将值一一列举出来,那么上面的变量mycolor1、mycolor2的值只限于列举出来的这些值的范围内,也就是Red、Green、Blue、Yellow之一(当然后续还有mycolor1、mycolor2不限于这些值范围的讲述,后续再说)。例如:
在这里插入图片描述

(2)可以直接定义枚举类型变量,不需要写枚举类型名。看看如下代码:
在这里插入图片描述

(3)Red、Green、Blue、Yellow,这些叫作枚举常量,记住,它们是常量,用来给枚举型变量赋值,那么这些枚举型常量所代表的值是多少呢?C语言编译器会按照它们定义时的顺序规定它们的值,并且值是从0开始,这说明,Red等于0、Green等于1、Blue等于2、Yellow等于3。看看如下代码:
在这里插入图片描述
(4)可以直接给枚举型变量赋值。看看如下代码:
在这里插入图片描述

(5)定义枚举类型时,可以改变默认的枚举常量的值(默认的枚举常量值前面说过是从0开始)。看看如下代码:
在这里插入图片描述

(6)枚举值,可以理解为整型值,只是在实际写代码时,有时写枚举值更容易让人懂,但不能把一个整数直接赋给一个枚举变量。看看如下代码:
在这里插入图片描述
但用强制类型转换是可以的:
在这里插入图片描述
这可能让人好奇,1000这个数字并不对应于枚举类型color中的任何一个枚举型常量值,但像上面这样写代码依然没有任何问题,mycolor1被成功赋予1000这个值,这进一步证明,枚举值其实是可以和整型值互通使用的。
此外,枚举值也可以进行比较判断操作:
在这里插入图片描述
(7)枚举值可以赋值给一个整型变量。看看如下代码:
在这里插入图片描述

用typedef定义类型

以往,代码中用的类型名都是C语言提供的标准类型名,如int、char、float、double等,当然,结构体、共用体、枚举类型等可以自己命名。此外,还可以用typedef关键字来定义新的类型名以代替已有的类型名。注意,typedef是用来定义新类型名的,不是用来定义变量的。看看如下代码:
在这里插入图片描述
这相当于用INTEGER代表了int,那么定义整型变量就可以这样定义:
在这里插入图片描述
也可以用typedef定义一个结构体类型:
在这里插入图片描述

上面这段代码定义了一个新的类型名DATE(不是定义结构体变量,因为前面有typedef关键字),代表上面定义的这个结构体类型。现在,可以用DATA来定义变量了。看看如下代码:
在这里插入图片描述

针对typedef的用法,还有一些变形,这些变形可以适当记一记,以后也许会遇到:
在这里插入图片描述

这里有一些重要说明,请注意:
(1)习惯上把用typedef定义的类型名用大写字母表示,以便区别于C语言提供的标准类型标识符,如int、char等。
(2)typedef是用来定义各种类型名的,不是用来定义变量的,这一点一定不能搞错。
(3)typedef只是对已经存在的类型增加一个类型名(相当于给类型起一个别名),并没有创造新类型。
(4)typedef是编译时处理的。
一个项目可以由一个或者多个源程序文件组成,一个项目可以通过编译、链接最终形成一个可执行文件。而编译这个步骤可以拆开来看,它实际也是做了好几件事情,包括:
· 预处理:#define、#include、#ifdef;
· 编译:词法和语法分析、目标代码生成、优化、typedef;
· 汇编:产生.o(.obj)目标文件。

(5)typedef最主要的作用是什么?其最主要的作用是有利于程序的通用性与可移植性。
例如以往这样定义int型变量:
在这里插入图片描述

将来如果想将所有int型变量都变成long型变量,就得找到所有int型变量定义的位置并逐个修改。但如果这样写代码定义,首先用一个typedef,如下所示:
在这里插入图片描述
然后在定义整型变量时不使用int来定义,而是使用INTEGER来定义。例如:

在这里插入图片描述
那以后若需要把int修改为long,只需要修改typedef这一行。例如:
在这里插入图片描述
这样所有的int类型变量就都被修改为long类型。

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

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

相关文章

Java开源项目mall学习笔记(1)——项目初始化

一、学习声明与项目介绍 该笔记是记录学习开源项目mall过程的文档笔记,完全原创,转载请声明。同时也对开源项目的作者表示感谢! mall: 🔥 mall项目是一套基于 SpringBoot Vue uni-app 实现的电商系统,包括前台商城项…

基于springboot+vue的武汉旅游网(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

快速搭建园林园艺商城小程序的五个关键步骤

园艺设计是现代人们爱好的一项活动,通过设计和布置花园,营造出美丽的自然景观,给人们带来舒适和愉悦的感觉。如今,随着科技的发展,园林园艺小程序商城成为了园艺爱好者们购物和交流的新平台。本文将为大家介绍一个简单…

Modbus_TCP协议如何使用?

1 驱动简介 网关支持标准的Modbus-TCP协议,支持Modbus-TCP协议的设备(例如智能仪表、电表等),都可以通过此协议直接通讯,实现远程采集、监控、控制设备的功能。 从站号:默认为1,需要查看设备说…

【实际开发21】- 项目部署

目录 1. 项目打包方式就两种 : war、jar 1. Windows 环境运行 Jar 包 2. Windows 后台运行 jar 包 1. cmd 下执行方式 2. bat 批处理方式 - ( Batch ) 3. 启动 : 在 xx.jar 同级目录下建立 run.bat 文件 4. 项目部署打包 忽略 test 文件 2. CICD 自动化部署 3. 代码质…

数据结构—散列表的查找

7.4散列表的查找 7.4.1散列表的基本概念 基本思想:记录的存储位置域关键字之间存在对应关系 ​ 对应关系——hash函数 ​ Loc(i) H(keyi) 如何查找: 根据散列函数 H(key) k 查找key9,则访…

【刷题笔记8.17】LeetCode:最长公共前缀

LeetCode:最长公共前缀 (一)题目描述 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 “”。 (二)分析 纵向扫描时,从前往后遍历所有字符串的每一列&am…

python开发环境准备

python开发环境准备 文章目录 python开发环境准备windows安装配置python3下载配置 安装pip(通过get-pip.py)测试与问题 测试python windows安装配置python3 校验日期 :2023年8月11日 下载 下载地址 官网地址 版本分为推荐下载最新的版本和…

leetcode 377. 组合总和 Ⅳ

2023.8.17 本题属于完全背包问题,乍一看和昨天那题 零钱兑换II 类似,但细看题目发现:今天这题是排列问题,而“零钱兑换II”是组合问题。排列问题强调顺序,而组合顺序不强调顺序。 这里先说个结论:先遍历物品…

原码、反码、补码,进制转换,有符号数和无符号数转换

计算机底层存储数据时,存储的是数据对应的二进制数字。对于整型数据,其二进制表示形式有三种,分别是:原码、反码、补码,而实际存储的是整型数据的补码。 原码、反码以及补码都是有符号的,其中最高位存放符…

windows系统丢失mfc120u.dll的解决方法

1.mfc120u.dll是什么 mfc120u.dll是Windows操作系统中的一个动态链接库(Dynamic Link Library,简称DLL)文件。它包含了一些用于运行C程序的函数和其他资源。这个特定的DLL文件是Microsoft Foundation Classes(MFC)库的…

LangChain源码逐行解密之系统(二)

LangChain源码逐行解密之系统 20.2 serapi.py源码逐行剖析 我们可以看一下Google查询的例子,在LangChain中有多种实现的方式。 如图20-5所示,在utilities的serpapi.py代码文件中实现了SerpAPIWrapper。 图20- 5 utilities的serpapi.py的SerpAPIWrapper 在langchain目录的se…

matplotlib从起点出发(7)_Tutorial_7_Artist

1 Artist教程 使用Artist对象来渲染画布。 matplotlib API一共有三个层次: matplotlib.backend_bases.FigureCanvas是绘制图形的区域;matplotlib.backend_bases.Renderer是知道如何在FigureCanvas上绘制的对象;matplotlib.artist.Artist是…

[NOIP2008 提高组] 传纸条——DP+优化

传纸条——DP优化 [NOIP2008 提高组] 传纸条题目描述输入格式输出格式样例样例输入样例输出 提示 温馨提示结题思路四维DP(不推荐)三维DP(推荐) A C 代码 [NOIP2008 提高组] 传纸条 题目描述 小渊和小轩是好朋友也是同班同学&am…

代码审计-Java项目审计-SQL注入漏洞

代码审计必备知识点: 1、代码审计开始前准备: 环境搭建使用,工具插件安装使用,掌握各种漏洞原理及利用,代码开发类知识点。 2、代码审计前信息收集: 审计目标的程序名,版本,当前环境(系统,中间件…

挑选最佳编程神器

选择适合的编程软件对于STM32开发至关重要。以下是几个值得推荐的软件:Arduino IDE:适用于跨单片机型号的编程。通过编写通用的Arduino代码,支持多达140多种主流单片机型号。无论是51、ST、ESP、GD、恩智浦、树莓派等,都可以使用统…

KVM虚拟机管理

1、创建、删除快照 关机 init0 列出快照 删除快照 2、虚拟机迁移 报错 解决:关闭防火墙,关闭selinux 其他解决办法:kvm热迁移使用nfs共享存储报错_莉法的博客-CSDN博客

serve : 无法将“serve”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。

1、在学习webpack打包的时候,需要 serve用来启动开发服务器来部署代码查看效果的。安装完之后运行出现以下错误: 2、使用命令查看安装目录: npm list -g我们已经安装过了 3、解决: 我们看到上图路径在:C:\Users\qiy…

SpringBoot整合Shiro实现登录认证,鉴权授权

文章目录 前言一、shiro简介二、环境搭建2.1.数据库2.1.1user用户表2.1.2user_role用户角色关系表2.1.3role角色表2.1.4role_permission角色权限关系表2.1.5permission权限表 2.2导坐标2.3实体类2.3.1User2.3.2Role2.3.3Permission 2.4MVC三层2.4.1User2.4.1.1mapper层2.4.1.2s…

python使用xlwt时,报ValueError: More than 4094 XFs (styles)

在写表格时,遇到如下报错 一、报错原因 xlwt最多只能有4094个样式,超出这个样式数量就报错了。 二、解决办法 (1)去掉样式的要求