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

共用体

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

在这里插入图片描述

有几点说明:
(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类型。

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

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

相关文章

【LeetCode75】第三十一题 反转链表

目录 题目: 示例: 分析: 代码: 题目: 示例: 分析: 最经典的链表题,没有之一!!! 强烈建议直接把模板记住!!&#xf…

LeetCode150道面试经典题-- 环形链表(简单)

1.题目 给你一个链表的头节点 head ,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置&…

Python中import模块导入的实现原理

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起探讨和分享Linux C/C/Python/Shell编程、机器人技术、机器学习、机器视觉、嵌入式AI相关领域的知识和技术。 Python中import模块导入的实现原理 什么是模块import搜索路径import导入模块的原理图书推荐 专栏&…

vue 数字递增(滚动从0到)

使用 html <Incremental :startVal"0" :endVal"1000" :duration"500" />js&#xff1a; import Incremental from /utils/num/numViewjs let lastTime 0 const prefixes webkit moz ms o.split( ) // 各浏览器前缀let requestAnimatio…

树莓派的自启动与桌面应用程序

目录 1 打开终端自启动 .bashrc 2 触发时机较早的开机自启动rc.local 3 桌面应用程序 4 触发时机较晚的的开机自启动 autostart 1 打开终端自启动 .bashrc .bashrc的程序也可以在开机时进行自启动&#xff0c;但是每一次打开终端时同样会运行一遍&#xff0c;所以只需…

5G科技防汛,助力守护一方平安

“立秋虽已至&#xff0c;炎夏尚还在”&#xff0c;受台风席卷以及季节性影响全国多地正面临强降水的严峻挑战。“落雨又顺秋&#xff0c;绵绵雨不休”&#xff0c;正值“七下八上” 防汛关键时期&#xff0c;贵州省水文水资源局已全面进入备战状态。 为确保及时响应做好防汛抢…

Eclipse如何设置快捷键

在eclopse设置注释行和取消注释行 // 打开eclipse&#xff0c;依次打开&#xff1a;Window -> Preferences -> General -> Key&#xff0c;

ARM64 程序调用标准

ARM64 程序调用标准 1 Machine Registers1.1 General-purpose Registers1.2 SIMD and Floating-Point Registers 2 Processes, Memory and the Stack2.1 Memory Addresses2.2 The Stack2.2.1 Universal stack constraints2.2.2 Stack constraints at a public interface 2.3 Th…

【Leetcode】98. 验证二叉搜索树

一、题目 1、题目描述 给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下: 节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。示例1: 输入:root = …

Nevron 3DChart Crack,可视化界面在运行时可用

Nevron 3DChart Crack,可视化界面在运行时可用 3DChart使用OpenGL 3D图形引擎创建复杂的2D和3D图表&#xff0c;这些图表可以包含静态或动画图像。3DChart包括一个用于生成图表模板的独立应用程序和一个ASP服务器配置实用程序。该组件还包括一个专门设计用于与3DChart集成的工具…

阿里云服务器安装部署Docker使用教程

本文阿里云百科分享如何在云服务ECS实例上&#xff0c;部署并使用Docker。Docker是一款开源的应用容器引擎&#xff0c;具有可移植性、可扩展性、高安全性和可管理性等优势。开发者可将应用程序和依赖项打包到一个可移植的容器中&#xff0c;快速发布到Linux机器上并实现虚拟化…

每日汇评:黄金在 200 日移动平均线附近似乎很脆弱,关注美国零售销售

1、金价预计将巩固其近期跌势&#xff0c;至 6 月初以来的最低水平&#xff1b; 2、对美联储再次加息的押注继续限制了贵金属的上涨&#xff1b; 3、金融市场现在期待美国零售销售报告带来一些有意义的推动&#xff1b; 周二金价难以获得任何有意义的牵引力&#xff0c;并在…

OpenCV-Python中的图像处理-GrabCut算法交互式前景提取

OpenCV-Python中的图像处理-GrabCut算法交互式前景提取 Python-OpenCV中的图像处理-GrabCut算法交互式前景提取 Python-OpenCV中的图像处理-GrabCut算法交互式前景提取 cv2.grabCut(img: Mat, mask: typing.Optional[Mat], rect, bgdModel, fgdModel, iterCount, mode…) img…

2011年下半年 软件设计师 上午试卷2

博主介绍&#xff1a;✌全网粉丝3W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

Nginx搭建本地服务器,无需购买服务器即可测试vue项目打包后的效果

一.前言 本文是在windows环境&#xff08;Linux环境下其实也大同小异&#xff09;下基于Nginx实现搭建本地服务器&#xff0c;手把手教你部署vue项目。 二.Nginx入门 1&#xff09;下载安装 进入Nginx官网下载&#xff0c;选择stable版本下的windows版本下载即可 2&#xff09;…

docker-compose redis 一直启动失败

环境&#xff1a; centos 8.x 背景 使用docker-compose 来启动redis docker-compose.yml 如下&#xff1a; version: 3.3 services:redis:image: redis:latestrestart: alwayscontainer_name: redisports:- 6379:6379volumes:- ./data:/redis/data- ./redis.conf:/redis/re…

【C++】set/multiset容器

1.set基本概念 #include <iostream> using namespace std;//set容器构造和赋值 #include<set>//遍历 void printSet(const set<int>& st) {for (set<int>::const_iterator it st.begin(); it ! st.end(); it){cout << *it << " …

五分钟搭建生鲜蔬果小程序

如今&#xff0c;随着移动互联网的快速发展&#xff0c;小程序已经成为众多企业和商家推广产品和服务的重要工具。而生鲜蔬果行业作为一个常见的消费领域&#xff0c;也开始逐渐转向小程序商城来进行销售和服务。那么&#xff0c;如何从零开始搭建一个生鲜蔬果小程序商城呢&…

通过TightVNC远程访问MacOS

目录 一、下载 TightVNC 下载链接&#xff1a;https://www.tightvnc.com/ 下载后按步骤进行安装&#xff0c;安装完成后安装目录如下&#xff1a; 运行 tvnviewer.exe&#xff0c;输入远程 IP&#xff0c;点击【connect】&#xff1a; 输入密码&#xff0c;点击【OK】后即可远…

基于SpringBoot+Thymeleaf仓库管理系统

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 随着信息技术的快速发…