⾃定义类型:联合和枚举(C语言版)

一.联合体.

1.1.联合体类型的声明,定义

像结构体⼀样,联合体也是由⼀个或者多个成员构成,这些成员可以不同的类型,但是编译器只为最⼤的成员分配⾜够的内存空间。联合体的特点是 所有成员共⽤同⼀块内存空间 。所以联合体也叫:共⽤体 给联合体其中⼀个成员赋值,其他成员的值也跟着变化
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
//联合类型的声明
union A
{
	char c;
	int i;
};
int main()
{
	//联合变量的定义
	union A a = { 0 };
	return 0;
}

如果我要计算联合体大小,你猜猜它是多大?

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
//联合类型的声明
union A
{
	char c;
	int i;
};
int main()
{
	//联合变量的定义
	union A a = { 0 };
	printf("%zd\n", sizeof(a));
	return 0;
}

结果:

1.2.联合体的特点

联合的成员是共⽤同⼀块内存空间的,这样⼀个联合变量的⼤⼩,⾄少是最⼤成员的⼤⼩(因为联合⾄少得有能⼒保存最⼤的那个成员)。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
//联合类型的声明
union Un
{
	char c;
	int i;
};
int main()
{
	//联合变量的定义
	union Un un = { 0 };
	// 下⾯输出的结果是⼀样的吗?
	printf("%p\n", &(un.i));
	printf("%p\n", &(un.c));
	printf("%p\n", &un);
	return 0;
}

结果:

说明,它们地址相同,即都在同一块内存空间内。

不信,再来看看例题二:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
union U
{
	char c;
	int i;
};
int main()
{
	union U un = { 0 };
	un.i = 0x11223344;
	un.c = 0x55;
	printf("%#x", un.i);
	return 0;
}

结果:

发现,改变c,i的结果也改变,说明它们共用一块空间。

1.3.相同成员的结构体和联合体对⽐

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
struct s
{
	char c;
	int i;
};
union u
{
	char c;
	int i;
};
int main()
{
	struct s s1 = { 0 };
	union u s2 = { 0 };
	printf("%zd\n", sizeof(s1));//8
	printf("%zd\n", sizeof(s2));//4
	return 0;
}

可见,联合体的合理运用可以节省空间

1.4.联合体⼤⼩的计算

联合的⼤⼩⾄少是最⼤成员的⼤⼩。
当最⼤成员⼤⼩不是最⼤对⻬数的整数倍的时候,就要对⻬到最⼤对⻬数的整数倍
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
union u1
{
	char c[5];
	int i;
};
union u2
{
	short s[7];
	int i;
};
int main()
{
	printf("%zd\n", sizeof(union u1));
	printf("%zd\n", sizeof(union u2));
	return 0;
}

结果:

所以,一定好好把握联合体大小,其大小不一定是最大成员数大小。

1.5.联合体运用.

⽐如,我们要搞⼀个活动,要上线⼀个礼品兑换单,礼品兑换单中有三种商品:图书、杯⼦、衬衫。 每⼀种商品都有:库存量、价格、商品类型和商品类型相关的其他信息。
图书:书名、作者、⻚数
杯⼦:设计
衬衫:设计、可选颜⾊、可选尺⼨

如果你直接这样写:

struct gift_list
{
	//公共属性
	int stock_number;//库存量
	double price;//定价
	int item_type;//商品类型
	//特殊属性
	char title[20];//书名
	char author;//作者
	int num_pages;//页数
	char design[30];//设计
	int color;//颜色
	int sizes;//尺寸
};
该结构其实设计的很简单,⽤起来也⽅便,但是结构的设计中包含了所有礼品的各种属性,这样
使得结构体的⼤⼩就会偏⼤,⽐较浪费内存。因为对于礼品兑换单中的商品来说,只有部分属性信息是常⽤的。⽐如: 商品是图书,就不需要design、colors、sizes。 所以我们就可以把公共属性单独写出来,剩余属于各种商品本⾝的属性使⽤联合体起来,这样就可以介绍所需的内存空间,⼀定程度上节省了内存。

struct gift_list
{
	//公共属性
	int stock_number;//库存量
	double price;//定价
	int item_type;//商品类型
	//特殊属性
	union U
	{
		struct s1
		{
			char title[20];//书名
			char author;//作者
			int num_pages;//页数
		}book;
		struct s2
		{
			char design[30];//设计
		};
		struct s3
		{
			char design[30];//设计
			int color;//颜色
			int sizes;//尺寸
		};
	};	
};

例题二:

用联合体来判断大小端?

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

二.枚举

2.1.枚举类型的声明

枚举顾名思义就是⼀⼀列举。 把可能的取值⼀⼀列举。
⽐如我们现实⽣活中:
⼀周的星期⼀到星期⽇是有限的7天,可以⼀⼀列举
性别有:男、⼥、保密,也可以⼀⼀列举
⽉份有12个⽉,也可以⼀⼀列举
三原⾊,也是可以意义列举
这些数据的表⽰就可以使⽤枚举了
enum sex
{
	man,
	wuman,
	secret
};
enum Day
{
	Monday,
	Tuesday,
	Wednesday,
	Thursday,
	Friday,
	Saturday,
	Sunday
};
enum color
{
	red, 
	yellow,
	blue
};
{}中的内容是枚举类型的可能取值,也叫 枚举常量 。
这些可能取值都是有值的,默认从0开始,依次递增1,当然在声明枚举类型的时候也可以赋初值
enum S
{
	a=2,
	b=4,
	c=7,
	d=10
};

2.2.枚举类型的优点

为什么使⽤枚举?
我们可以使⽤ #define 定义常量,为什么⾮要使⽤枚举?(这个我也不是很有体会,希望大家一起去悟)
枚举的优点:
增加代码的可读性和可维护性
和#define定义的标识符⽐较枚举有类型检查,更加严谨。
便于调试,预处理阶段会删除 #define 定义的符号
使⽤⽅便,⼀次可以定义多个常量
枚举常量是遵循作⽤域规则的,枚举声明在函数内,只能在函数内使⽤

2.3.枚举类型的使⽤

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
enum Color
{
	red=5,
	yellow=7,
	blue=10
};
int main()
{
	enum Color clr =red;//使⽤枚举常量给枚举变量赋值
	printf("%d\n", clr);//5
	return 0;
}
整数给枚举变量赋值呢?在C语⾔中是可以的,但是在C++是不⾏的,C++的类型检查⽐
较严格
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
enum Color
{
	red=5,
	yellow=7,
	blue=10
};
int main()
{
	enum Color clr =red;//使⽤枚举常量给枚举变量赋值
	printf("%d\n", clr);//5
	clr = 7;
	printf("%d\n", clr);//7
	return 0;
}

C++:

会直接报错!!!

最后,学习加油!!!

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

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

相关文章

TextCNN文本分类快速上手

这里写目录标题 TextCNN介绍&#xff1a;Docker从0安装Docker基于镜像安装容器打包操作&#xff08;生成镜像时使用的命令&#xff09;安装时命令 页面访问模型训练API访问性能测试其他查看显卡信息 TextCNN介绍&#xff1a; 1.支持语义识别和分类置信度输出。 2.训练速度快&…

10倍提升启动的时间?Graalvm打包Springboot+MyBatis实测

graalvm使用前后对比图 相关代码博客&#xff1a;https://blog.csdn.net/weixin_43914278/article/details/134446327 工具大小时间graalvm打包的exe文件84.14MB0.251秒graalvm打包的docker文件121.27MB0.253秒jar包51.34MB2.153秒 解析 文件大小: graalvm打包的Docker文件…

如何提高WhatsApp回复率,附相关进阶技巧

现在WhatsApp开发客户基本上也是成为了很多外贸人的共识了&#xff0c;基本上大部分的外贸朋友都有在用。但是用多了就会发现&#xff0c;虽然WhatsApp的回复率是比较高的&#xff0c;但是很多都是礼貌性回复&#xff0c;真正进行营销的时候&#xff0c;其实客户还是很多不会回…

scikit-learn线性回归法进行利润预测

大家好&#xff0c;生成式人工智能无疑是一个改变游戏规则的技术&#xff0c;但对于大多数商业问题来说&#xff0c;回归和分类等传统的机器学习模型仍然是首选。 私募股权或风险投资这样的投资者利用机器学习&#xff0c;首先必须了解关注的数据以及它是如何被使用的。投资公…

TimeGPT:时间序列预测模型实例

时间序列预测领域正在经历一个非常激动人心的时期。在过去的三年里&#xff0c;我们见证了许多重要的贡献&#xff0c;如N-BEATS、N-HiTS、PatchTST和TimesNet等。同时&#xff0c;大型语言模型&#xff08;LLM&#xff09;近来在流行度方面取得了很大的成功&#xff0c;例如Ch…

【源码解析】聊聊线程池 实现原理与源码深度解析(一)

一、Java 线程池 实现原理与源码深度解析 架构 总揽线程池设计&#xff0c;其实可以发现都是符合顶层的接口设计&#xff0c;中间抽象类&#xff0c;最终是实际工作类 使用示例 public class MyRunnable implements Runnable{Overridepublic void run() {System.out.println…

深度学习——第3章 Python程序设计语言(3.2 Python程序流程控制)

3.2 Python程序流程控制 目录 1.布尔数据类型及相关运算 2.顺序结构 3.选择&#xff08;分支&#xff09;结构 4.循环结构 无论是在机器学习还是深度学习中&#xff0c;Python已经成为主导性的编程语言。而且&#xff0c;现在许多主流的深度学习框架&#xff0c;例如PyTorc…

EXPLAIN解析

针对以下sql进行解析 EXPLAIN SELECTdauk.id AS daukId,dasm.mailbox AS storeAccount,dau.id,dau.id AS userId,das.score AS score,das.sell_num AS sellNum,dapa.product_link AS productLink,dapa.able_category_ids AS ableCategoryIds,dac.parent_name AS parentName,da…

SAP_ABAP_RZ11解决SAP运行超时问题 TIME_OUT / rdisp/scheduler/prio_high/max_runtime

SAP ABAP 顾问&#xff08;开发工程师&#xff09;能力模型_Terry谈企业数字化的博客-CSDN博客文章浏览阅读510次。目标&#xff1a;基于对SAP abap 顾问能力模型的梳理&#xff0c;给一年左右经验的abaper 快速成长为三年经验提供超级燃料&#xff01;https://blog.csdn.net/j…

Unity | 渡鸦避难所-1 | 修复资源导入后呈现洋红色(Built-in 转 URP)

1 前言 Unity 编辑器导入 Asset Store 的资源包后&#xff0c;在预览和使用时&#xff0c;发现对象显示为洋红色 以小狐狸为例&#xff0c;打开资源包中的场景&#xff0c;可以看到小狐狸和地板均显示为洋红色 这是因为 Asset Store 中的资源包大部分是针对内置渲染管线项目制…

自然语言处理:电脑如何理解我们的语言?

☁️主页 Nowl &#x1f525;专栏《机器学习实战》 《机器学习》 &#x1f4d1;君子坐而论道&#xff0c;少年起而行之 ​ 文章目录 ​编辑 常见方法 1.基于词典的方法 2.基于计数的方法 基于推理的方法 Bert input_ids attention_mask token_type_ids 结语 在广…

施密特触发器

1、作用 简单来说&#xff0c;施密特触发器可以将模拟信号转变成数字信号 2、为什么不使用比较器将模拟信号转变成数字信号 当输入电平高于参考电压时&#xff0c;输出高电平&#xff1b;输入电压低于参考电压时&#xff0c;输出低电平。这样比较器也可以实现模拟信号转换成数…

封装Servlet使用自定义注解进行参数接收

文章目录 前言一、前后对比✨二、具体实现&#x1f387;三、效果展示&#x1f38f; 前言 先说项目背景&#xff0c;本项目是本人在校期间老师布置的作业&#xff08;就一个CRUD&#xff09;&#xff0c;课程是后端应用程序设计&#xff0c;其实就是servlet和jsp那一套&#xf…

Python异常处理【侯小啾python领航班系列(二十六)】

Python异常处理【侯小啾python领航班系列(二十六)】 大家好,我是博主侯小啾, 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹…

Java三种代理模式:静态代理、动态代理和CGLIB代理

Java三种代理模式&#xff1a;静态代理、动态代理和CGLIB代理 代理模式 代理模式是23种设计模式种的一种。代理模式是一种结构型设计模式&#xff0c;它允许为其他对象提供一个替代品或占位符&#xff0c;以控制对这个对象的访问。代理模式可以在不修改被代理对象的基础上&am…

SPM/SCM 流量跟踪体系

SPM SPM&#xff08;shopping page mark&#xff0c;导购页面标记&#xff09; 是淘宝社区电商业务&#xff08;xTao&#xff09;为外部合作伙伴&#xff08;外站&#xff09;提供的跟踪引导成交效果数据的解决方案 注&#xff1a;也有解释 SPM 为超级位置模型(Super Position…

2024年甘肃省职业院校技能大赛(中职教师组)网络安全竞赛样题卷④

2024年甘肃省职业院校技能大赛&#xff08;中职教师组&#xff09;网络安全竞赛样题卷④ 2024年甘肃省职业院校技能大赛&#xff08;中职教师组&#xff09;网络安全竞赛样题卷④A模块基础设施设置/安全加固&#xff08;本模块200分&#xff09;A-1任务一 登录安全加固&#xf…

(C++)和为s的两个数字--双指针算法

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 和为S的两个数字_牛客题霸_牛客网输入一个升序数组 array 和一个数字S&#xff0c;在数组中查找两个数&#xff0c;使得他们的和正好是S&#xff0c;如果。题目来自【牛客题霸】https://www.nowcoder.com/practice/390da4f7a…

关于你对 Zookeeper 的理解

看看普通人和高手是如何回答这个问题的&#xff1f; 普通人 Zookeeper 是一种开放源码的分布式应用程序协调服务 是一个分布式的小文件存储系统 一般对开发者屏蔽分布式应用开发过过程种的底层细节 用来解决分布式集群中应用系统的一致性问题 高手 对于 Zookeeper 的理解…

网工学习9-STP配置

如图 1 所示&#xff0c;当前网络中存在环路&#xff0c; SwitchA 、SwitchB 、SwitchC 和 SwitchD 都运行 STP&#xff0c;通过 彼此交互信息发现网络中的环路&#xff0c;并有选择的对某个端口进行阻塞&#xff0c;最终将环形网络结构修剪成无 环路的树形网络结构&#xff…