共用体与枚举类型

2023-09-22 14:37:58

9.7共用体

9.7.1引例

【例10.1】高校学生的课程设置中,有些课程是必修课,有些是选修课程,各门课程的考核方式不同,必修课采用百分制,选修课可以采用百分制和五级制(如'A''B''C''D''E')两种。学生在完成学校规定的课程的同时,可以根据需要选择自己感兴趣的一些课程。假设某个学期有三门选修课程:统计学(百分制)、电脑维护(百分制)、旅游管理(五级制),每位学生只能选择其中一门。编程实现输入若干个学生的成绩,统计各门选修课的人数并分别输出选修课的成绩。

9.7.2共用体类型与共用体变量

1.共用体类型

共用体,也叫联合体,是一种用户自定义的构造数据类型,它使几个不同类型的变量共占同一段内存。即在计算机的内存中分配一个特殊的存储空间,该存储空间是由若干个连续的内存单元构成的,各种不同类型的数据均可以存放在该存储空间中。共用体实质上是采用了覆盖技术,使几个变量互相覆盖。

声明一个共用体类型的一般形式为:

union 共用体名

{     类型名 成员名1;

类型名 成员名2;

……

类型名 成员名n;

};

关键字union是共用体类型的标志,“union 共用体名”共同构成共用体类型。注意括号后的分号是不可少的。

2.共用体变量

声明了共用体类型后就可以用它来定义共用体变量了,和结构变量的定义方法一样,定义共用体变量的方法也有三种:

方法一:先声明共用体类型,然后再定义共用体变量

方法二:声明共用体类型的同时定义共用体变量

方法三:直接定义共用体变量

3.共用体数组和共用体指针变量

声明了共用体类型后,也可以定义共用体数组和共用体指针变量,定义和使用方法同共用体变量。

9.7.3共用体变量的初始化

(1)由于共用体变量只有一个成员起作用,因此对共用体变量的初始化只能有一个初始值,也可以不加花括号。

(2)不能同时对共用体变量的所有成员进行初始化。

(3)共用体变量的初始化操作实际上是对其第一个成员进行的初始化。如果初始值的类型与第一个成员的类型不同,则系统会进行自动类型转换。

9.7.4共用体变量的使用

1.共用体变量的使用

定义了共用体变量后就能在程序中引用它了,但是不能整体引用共用体变量,而只能引用共用体变量中的成员,并且不能同时引用多个成员,在某一时刻,只能使用其中之一的成员。

对于共用体变量成员的引用也是通过成员运算符“.”进行的,引用方式为:

共用体变量名.成员名

2.共用体变量作为参数

与结构变量类似,共用体变量可以作为参数进行传递。共用体作为实参传递的是共用体变量的值,也可以使用共用体数组或共用体指针传递地址。

3.共用体和结构的嵌套

共用体和结构可以嵌套使用,即结构中的成员可以是共用体,共用体中的成员也可以是结构。引用内部成员的方式如下:

结构变量.共用体变量.成员

共用体变量.结构变量.成员

9.8枚举

9.8.1引例

【例9.10】某餐厅用西瓜、桃子、草莓、香蕉、菠萝、苹果六种水果制作水果拼盘,要求每个拼盘中有四种不同水果。编写程序计算可以制作出多少种这样的水果拼盘。

9.8.2枚举类型的定义

1.枚举类型

声明一个枚举类型的一般形式为:

enum 枚举名{      枚举值列表   };

(1)关键字enum是枚举类型的标志,“enum 枚举名”构成枚举类型。

(2)枚举是一个集合,集合中的元素(称为枚举成员或枚举常量)是一些特定的标识符,元素之间用逗号隔开。

(3)在枚举类型中,枚举成员是有值的,第一个枚举成员的默认值为0,后续成员的值依次递增。

(4)枚举成员是常量,不能对它们赋值。如“red=1;”是错误的。但是在定义枚举类型时可以指定枚举成员的值。

(5)同一个程序中不能定义同名的枚举类型,不同的枚举类型中也不能存在同名的枚举成员。

2.枚举变量

声明了枚举类型后,可以使用它来定义枚举变量,定义的方法与结构、共用体类似,有以下三种形式:

形式一:先定义枚举类型,然后定义枚举变量

形式二:定义枚举类型的同时定义枚举变量

形式三:直接定义枚举变量

使用枚举变量时需注意:

(1)枚举变量的值只能为枚举类型中列举出来的枚举成员。

(2)枚举成员不是字符常量或字符串常量,使用时不能加单引号或双引号。

(3)不能将一个数值直接赋值给枚举变量。

9.8.3枚举类型的使用

1.枚举类型数据的输入输出

枚举类型的数据不能直接进行输入输出。在输入时应先输入其序号,然后使用强制类型转换完成;输出时应先进行转换才能输出其对应的字符串。

2.枚举类型数据的关系运算

同一种枚举类型数据可以进行关系运算,枚举类型数据的比较是对其序号进行比较。

3.枚举类型与sizeof运算符

在C语言中,枚举类型是被当作整型常量来处理的,因此枚举类型占用内存字节数为2,可以使用sizeof运算符来计算。

9.9类型定义

C语言不仅提供了丰富的数据类型,还允许用户自己定义类型说明符,即允许用户为数据类型取“别名”,类型定义符typedef可用来实现此功能。

使用typedef定义类型说明符的格式为:

typedef 类型标识符 别名;

其中,类型标识符可以是C语言中的基本数据类型或者是构造数据类型。

使用typedef定义类型的步骤如下:

(1)按定义变量方法写出定义体,如:int i;

(2)将变量名换成新类型名,如:int INTEGER;

(3)最前面加typedef,如:typedef int INTEGER;

(4)用新类型名定义变量,如:INTEGER i,j;

更多推荐

ctfshow web入门(1)

web1查看页面源代码web2ctr+uweb3因为查看源码没有东西,网络查看下数据包,找到flagweb4robots协议其他都没啥信息,就看下robots.txt,这个文件可能会泄露部分网站目录访问下,看到了web5phps泄露也没啥信息,在响应头里面看到了X-Powered-By:PHP/7.3.11得知-网站是

Grom 如何解决 SQL 注入问题

什么是SQL注入SQL注入是一种常见的数据库攻击手段,SQL注入漏洞也是网络世界中最普遍的漏洞之一。SQL注入就是恶意用户通过在表单中填写包含SQL关键字的数据来使数据库执行非常规代码的过程。这个问题的来源就是,SQL数据库的操作是通过SQL命令执行的,无论是执行代码还是数据项都必须卸载SQL语句中,这就导致如果我们在

【操作系统笔记十二】Linux常用基础命令

Linux常用快捷键Tab命令或路径等的补全键,特别常用的快捷键Ctrl+insert复制命令行内容(常用可提高效率)Shift+insert粘贴命令行内容(常用可提高效率)Ctrl+C中断当前任务(退出)Ctrl+Z暂停当前任务Ctrl+I清除屏幕所有的内容Ctrl+A光标迅速回到行首Ctrl+E光标迅速回到行尾Ct

红 黑 树

文章目录一、红黑树的概念二、红黑树的实现1.红黑树的存储结构2.红黑树的插入一、红黑树的概念在AVL树中删除一个结点,旋转可能要持续到根结点,此时效率较低红黑树也是一种二叉搜索树,通过在每个结点中增加一个位置来存储红色或黑色,并对结点的着色进行限制,使得该二叉搜索树的最长路径不超过最短路径的两倍,即红黑树是一颗近似平衡

【postgresql】ERROR: column “xxxx.id“ must appear in the GROUP BY

org.postgresql.util.PSQLException:ERROR:column"xxx.id"mustappearintheGROUPBYclauseorbeusedinanaggregatefunction错误:列“XXXX.id”必须出现在GROUPBY子句中或在聚合函数中使用在mysql中是正常使用

【八大经典排序算法】冒泡排序

【八大经典排序算法】冒泡排序一、概述二、思路解读三、代码实现四、优化一、概述冒泡排序由于其简单和易于理解,使其成为初学者学习排序算法的首选,也是初学者接触到的第一个排序算法。其原理是通过重复交换相邻的元素来将最大的元素逐步“冒泡”到最后。冒泡排序由美国计算机科学家冯·诺伊曼(JohnvonNeumann)于1945年提

使用singularity本地部署wandb

1.背景:wandbself-host(本地部署)官网只支持docker,而不支持singularity,但是现在部分高校或者企业在集群上完全使用singularity替代docker(原因:docker可以挂载任意目录,而容器内是root权限,导致容器外对文件设置的权限,在容器内完全是无用的,因为root用户可以访问

内存泄漏,内存溢出,抽象类和接口,netstat、ping、ifconfig的区别

持续学习是我们必备的技能之一,保持与时俱进,保持行业的敏感度,关注行业发展趋势,了解新技术,加强自己的认知,积极的应对变化内存泄漏memoryleak是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄漏似乎不会有大的影响,但内存泄漏堆积后的后果就是内存溢出内存泄漏可以分为四类1、常发性内存泄漏,发生内存泄漏的代

微信小程序部分知识点总结

简单描述下微信小程序的目录结构微信小程序的目录结构如下:app.js。微信小程序的主逻辑文件,用于描述小程序的基本逻辑和程序入口。app.json。微信小程序的公共设置文件,用于描述小程序的全局配置项,如页面路径、窗口样式等。app.wxss。微信小程序的公共样式表文件,用于描述小程序的全局样式,如字体、颜色等。pag

Java基于基于微信小程序的快递柜管理系统

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W+、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌文章目录第一章:简介第二章、***\*开发环境:\******后端:****前端:****数据库:**第三章系统设计3.3系统功能设计3.3.1用户注册

APP开发者如何运用积分墙广告,提升APP应用下载和用户留存?

“积分墙”移动广告通过在应用内展示各种积分任务,鼓励用户完成任务以获得积分奖励,从而增加应用的曝光度和下载量。一、什么是积分墙?积分墙是一种第三方移动广告平台。开发者可以在这类平台上发布任务(如下载安装App、注册、填表等),用户完成相应任务就可以获得积分或现金奖励,达到指定额度可以提现。二、积分墙包含哪几部分?(1)

热文推荐