自定义类型:枚举(enum)+联合体(union)

枚举+联合体

  • 一.枚举
    • 1.枚举类型的声明
    • 2.枚举类型的优点
    • 3.枚举类型的使用
  • 二.联合体
    • 1.联合体类型的声明
    • 2.联合体的特点
    • 3.相同成员的结构体和联合体对比
    • 4.联合体大小的计算
    • 5.联合体的练习(判断大小端)
    • 6.联合体节省空间例题

一.枚举

1.枚举类型的声明

  • 枚举顾名思义就是一一列举,把可能的取值一一列举。

比如我们现实生活中:

  1. 一周的星期⼀到星期日是有限的7天,可以一一列举。
  2. 性别有:男、女、保密,也可以一一列举。
  3. 月份有12个月,也可以一一列举。
  4. 三原色,也是可以一一列举。

这些数据的表示就可以使用枚举了,代码如下:

#include<stdio.h>
enum Day//星期 
{
	//该枚举类型有七种可能值,它们都是常量,被称为枚举常量
	Mon,
	Tues,
	Wed,
	Thur=9,
	Fri,
	Sat,
	Sun
};
int main()
{
	enum Day day1 = Mon;
	enum Day day2 = Sun;
	enum Day day3 = 7;//error,不能为枚举类型的变量(day3)赋值,只能赋值为枚举常量(Sun)

	printf("%d\n", Mon);//0
	printf("%d\n", Tues);//1
	printf("%d\n", Wed);//2
	printf("%d\n", Thur);//9
	printf("%d\n", Fri);//10
	printf("%d\n", Sat);//11
	printf("%d\n", Sun);//12
	return 0;
}
  1. 以上定义的 enum Day ,是枚举类型
  2. { }中的内容是枚举类型的可能取值,也叫枚举常量
  3. 枚举类型的值通常是整数常量
  4. 这些可能取值都是有值的,默认从0开始,依次递增1,当然在声明枚举类型的时候也可以赋初值,后面的值也是依次递增1。

2.枚举类型的优点

  • 我们可以使用 #define 定义常量,为什么非要使用枚举?

枚举的优点:

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

  2. 和 #define 定义的标识符比较枚举有类型检查,更加严谨。

  3. 便于调试,预处理阶段会删除 #define 定义的符号。

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

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

3.枚举类型的使用

  • 枚举举例:写一个计算器完成整数的加法,减法,乘法,除法
#include<stdio.h>
enum Option
{
	EXIT,//0
	ADD,//1
	SUB,//2
	MUL,//3
	DIV//4
};
void menu()
{
	printf("*************************\n");
	printf("**1:add           2:sub**\n");
	printf("**3:mul           4:div**\n");
	printf("**0:exit                 \n");
	printf("*************************\n");
}
int Add(int x, int y)
{
	return x + y;
}
int Sub(int x, int y)
{
	return x - y;
}
int Mul(int x, int y)
{
	return x * y;
}
int Div(int x, int y)
{
	return x / y;
}
int Cal(int(*pf)(int, int))
{
	int ret = 0;
	int x = 0;
	int y = 0;
	printf("请输入两个数:>");
	scanf("%d %d", &x, &y);
	ret = pf(x, y);
	printf("%d\n", ret);
}
int main()
{
	int input = 0;
	do
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case ADD:
			Cal(Add);
			break;
		case SUB:
			Cal(Sub);
			break;
		case MUL:
			Cal(Mul);
			break;
		case DIV:
			Cal(Div);
			break;
		case EXIT:
			printf("退出\n");
			break;
		default:
			printf("选择错误,请重新选择\n");
			break;
		}
	} while (input);
	return 0;
}

二.联合体

1.联合体类型的声明

  1. 像结构体⼀样,联合体也是由⼀个或者多个成员构成,这些成员可以不同的类型,但是编译器只为最大的成员分配足够的内存空间。
  2. 联合体的特点是所有成员共⽤同⼀块内存空间。所以联合体也叫:共用体
#include<stdio.h>
union Un//联合体
{
	char c;
	int i;
};
int main()
{
	printf("%zd\n", sizeof(union Un));//4个字节
	return 0;
}
  • 运行可知联合体union Un只占用4个字节,这是为什么呢?

2.联合体的特点

  1. 联合的成员是共用同一块内存空间的,这样一个联合变量的大小至少是最大成员的大小(因为联合至少得有能力保存最大的那个成员)。
  2. 修改联合体其中⼀个成员,其他成员的值也跟着变化。
#include<stdio.h>
union Un
{
	char c;
	int i;
};
int main()
{
	union Un un = { 0 };
	printf("& un   =%p\n", &un);
	printf("&(un.c)=%p\n", &(un.c));
	printf("&(un.i)=%p\n", &(un.i));
	return 0;
}

在这里插入图片描述

#include <stdio.h>
//联合类型的声明 
union Un
{
	char c;
	int i;
};
int main()
{
	//联合变量的定义 
	union Un un = { 0 };
	un.i = 0x11223344;
	un.c = 0x55;
	printf("%x\n", un.i);//11223355
	return 0;
}

在这里插入图片描述

3.相同成员的结构体和联合体对比

#include<stdio.h>
struct S//结构体
{
	char c;
	int i;
};
union Un//联合体
{
	char c;
	int i;
};
int main()
{
	printf("%zd\n", sizeof(struct S));//8个字节
	printf("%zd\n", sizeof(union Un));//4个字节
	return 0;
}
  • 对比一下相同成员的结构体和联合体的内存布局情况。

在这里插入图片描述

4.联合体大小的计算

  1. 联合的大小至少是最大成员的大小。
  2. 当最大成员大小不是最大对齐数的整数倍的时候,联合的大小就是最大对齐数的整数倍。
#include<stdio.h>
union Un
{
	char arr[5];
	//相当于五个char变量,char c1;char c2;char c3;char c4;char c5;
	//自身大小:1,默认对齐数:8,对齐数:1

	int i;//自身大小:4,默认对齐数:8,对齐数:4

	//二者的最大对齐数是4,联合体的总大小是4的倍数,
	//而5不是4的倍数,所以联合体的大小是8
};
union Un2
{
	short c[7];//14  2 8 2
	int i;//         4 8 4
};
int main()
{
	printf("%zd\n", sizeof(union Un));//8
	printf("%d\n", sizeof(union Un2));//16
	return 0;
}

在这里插入图片描述

5.联合体的练习(判断大小端)

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

在这里插入图片描述

6.联合体节省空间例题

  • 比如,我们要搞一个活动,要上线一个礼品兑换单,礼品兑换单中有三种商品:图书、杯子、衬衫。每⼀种商品都有:库存量、价格、商品类型和商品类型相关的其他信息。
  1. 图书:书名、作者、页数。
  2. 杯子:设计。
  3. 衬衫:设计、可选颜色、可选尺寸。

那我们不耐心思考,直接写出以下结构:

#include<stdio.h>
struct gift_list
{
	//公共属性 
	int stock_number;//库存量 
	double price; //定价 
	int item_type;//商品类型 

	//特殊属性 
	char title[20];//书名 
	char author[20];//作者 
	int num_pages;//页数 
	char design[30];//设计 
	int colors;//颜色
	int sizes;//尺寸
};
  • 上述的结构其实设计的很简单,用起来也方便,但是结构的设计中包含了所有礼品的各种属性,这样使得结构体的大小就会偏大,比较浪费内存。因为对于礼品兑换单中的商品来说,只有部分属性信息是常用的。

比如:

  • 商品是图书,就不需要design、colors、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 colors;//颜色
			int sizes;//尺寸
		}shirt;

	}item;
	//g.item.book.num_pages=20;
}g;

创作不易,如果能帮到你的话能赏个三连吗?感谢啦!!!

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

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

相关文章

HTML制作一个日蚀的动画特效

大家好&#xff0c;今天制作一个日蚀动画特效&#xff01; 先看具体效果&#xff1a; 使用一个逐渐扩大的圆形阴影来模拟月亮遮挡太阳的效果。使用了CSS的keyframes动画和border-radius属性来创建一个简单的圆形阴影效果。 HTML <!DOCTYPE html> <html lang"e…

Linux构建本地时间同步ntp

环境介绍&#xff1a; 主机名 IP地址 系统发行版 环境 Node01 192.168.100.102 Centos 7.4 可联网、已关闭防火墙selinux Node02 192.168.100.103 Centos 7.4 已关闭防火墙selinux 1.主节点同步阿里云标准时间 在保证连接外网的情况下&#xff0c;同步阿里服务器的…

Rust 实战丨SSE(Server-Sent Events)

&#x1f4cc; SSE&#xff08;Server-Sent Events&#xff09;是一种允许服务器向客户端浏览器推送信息的技术。它是 HTML5 的一部分&#xff0c;专门用于建立一个单向的从服务器到客户端的通信连接。SSE的使用场景非常广泛&#xff0c;包括实时消息推送、实时通知更新等。 S…

Linux2(文件类型分类 基本命令2 重定向)

目录 一、文件类型分类 二、基本命令2 1. find 帮助查询 2. stat 查看文件的信息 3. wc 统计文本 4. 查看文本内容 4.1 cat 4.2 more 4.3 less 4.4 head 4.5 tail 5. cal 显示日历 6. date 显示时间 7. du 文件大小 8. ln 链接 软链接 硬链接 区别 9. histo…

如何解除内存卡的写保护并格式化为exFAT文件系统

最近有客户提问内存卡提示写保护&#xff0c;且无法格式化为exFAT格式的问题&#xff0c;可能是由于多种原因引起的。以下是一些可能的解决方法&#xff1a; 1. 检查物理写保护开关 一些SD卡和MicroSD卡适配器上有一个小的物理开关&#xff0c;可以启用或禁用写保护。确保这个…

在Dataworks调度里检查上游表的分区是否已经产出

在Dataworks调度里检查上游表的分区是否已经产出 新建PyOdps3节点&#xff0c;贴如如下代码&#xff1a; import sys import time from datetime import datetimebizdate args[bizdate] if not o.exist_table(args[table]):sys.exit(1)# 设置结束时间为今天的20:00 end_time …

[项目推荐]EmoLLM-心理健康大模型

EmoLLM 是一系列能够支持理解用户-支持用户-帮助用户心理健康辅导链路的开源心理健康大模型&#xff0c;由LLM指令微调而来。它旨在全面理解和促进个体、群体乃至整个社会的心理健康状态。 项目介绍 GitHub&#xff1a;https://github.com/SmartFlowAI/EmoLLM 【EmoLLM项目提供…

30、 shell脚本进阶

shell脚本ifcase 一、条件测试 1.1、条件测试&#xff1a;$?----返回码&#xff0c;判断命令或者脚本是否执行成功&#xff08;最近的一条&#xff09; 0 true 为真就是成功 成立 非0 false 失败或者异常。 二、test命令 test命令&#xff1a;可以进行条件测试&#xff…

【SQL边干边学系列】07高级问题-3

文章目录 前言回顾高级问题41.逾期订单42.逾期订单-哪些员工&#xff1f;43.逾期订单与总订单相比44.逾期订单与总订单相比 - 丢失的员工45.逾期订单与总订单相比 - 修复null46.逾期订单与总订单之间的百分比47.逾期订单与总订单相比 - 修正decimal 答案41.逾期订单42.逾期订单…

Python Flask框架基础(七)留言板

本章示例程序是一个非常简单的留言板程序SayHello&#xff0c;涉及的知识完全是前面六个章节的内容 。这一章会基于这个程序介绍一种组织代码的形式&#xff0c;并了解Web程序开发流程&#xff0c;对前面六章的知识进行简单的回顾复习。 在具体的开发中&#xff0c;代码编写主…

AI大模型探索之路-实战篇:智能化IT领域搜索引擎之GLM-4大模型技术的实践探索

系列篇章&#x1f4a5; No.文章1AI大模型探索之路-实战篇&#xff1a;智能化IT领域搜索引擎的构建与初步实践2AI大模型探索之路-实战篇&#xff1a;智能化IT领域搜索引擎之GLM-4大模型技术的实践探索3AI大模型探索之路-实战篇&#xff1a;智能化IT领域搜索引擎之知乎网站数据获…

【计算机毕业设计】257基于大学生社团活动管理的微信小程序

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

二分+ST表+递推,Cf 1237D - Balanced Playlist

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 Problem - 1237D - Codeforces 二、解题报告 1、思路分析 case3提示我们一件事情&#xff1a;如果存在某个位置永远不停止&#xff0c;那么所有位置都满足永远不停止 很容易证明 随着下标右移&#xff0c…

YOLOv10原理与实战训练自己的数据集

课程链接&#xff1a;YOLOv10原理与实战训练自己的数据集_在线视频教程-CSDN程序员研修院 YOLOv10是最近提出的YOLO的改进版本。在后处理方面&#xff0c;提出了一致性双重分配策略用于无NMS训练&#xff0c;从而实现了高效的端到端检测。在模型架构方面&#xff0c;引入了全面…

Ubuntu安装opendaylight控制器

目录 实验任务 实验环境 安装过程&#xff1a; 将opendaylight添加到环境变量中 实验任务 在虚拟机1中安装opendaylight控制器并安装相应的组件在虚拟机2中使用mininet创建一个测试拓扑并将控制器的地址指向虚拟机1在虚拟机1中的opendaylight的web界面可以查看到创建的拓扑将…

实践分享:鸿蒙跨平台开发实例

先来理解什么是跨平台 提到跨平台&#xff0c;要先理解什么是“平台”&#xff0c;这里的平台&#xff0c;就是指应用程序的运行环境&#xff0c;例如操作系统&#xff0c;或者是Web浏览器&#xff0c;具体的像HarmonyOS、Android、iOS、或者浏览器&#xff0c;都可以叫做平台…

[vue2]深入理解路由

本节目标 单页应用程序路由概念VueRouter基本使用组件分类存放路由模块封装声明式导航其他路由配置路由模式编程式导航案例-面经基础版 单页应用程序 单页应用程序(SPA): 所有的功能都在一个HTML页面上实现 网易云音乐: 网易云音乐 多页应用程序(MPA): 不同功能通过切换不同…

透平油氧化安定性检测 发动机油运动粘度40℃检测

透平油氧化安定性检测 透平油&#xff0c;也称为涡轮机油或汽轮机油&#xff0c;是专门用于汽轮机的润滑油。它具有良好的抗氧化安定性和抗乳化性能&#xff0c;主要用于发电厂蒸气轮机、水电站水轮发电机以及其他需要深度精细润滑的场合。透平油的氧化安定性是衡量其在高温条件…

CentOs7 安装mysql5.7

1.卸载原系统中的mariadb…… 首先执行命令rpm -qa|grep mariadb查看是否有mariadb的安装包&#xff0c;没有可以不管 接下来&#xff0c;执行 rpm -e --nodeps mariadb-libs #删除掉下载mysql5.7安装包 1.前往官方网站复制yum源链接Mysql官网 然后鼠标右键粘贴 wget 执行…

极限网关助力好未来 Elasticsearch 容器化升级

极限网关在好未来的最佳实践案例&#xff0c;轻松扛住日增百 TB 数据的流量&#xff0c;助力 ES 从物理机到云原生架构的改造&#xff0c;实现了流控、请求分析、安全管理、无缝迁移等场景。一次完美的客户体验~ 背景 物理机架构时代 2022 年&#xff0c;好未来整个日志 Elas…