C语言之自定义类型:联合和枚举

news2024/10/6 16:29:18

目录

    • 1. 联合体类型的声明
    • 2. 联合体的特点
    • 3. 联合体大小的计算
      • 联合的一个练习
    • 4. 枚举类型的声明
    • 5. 枚举类型的优点
    • 6. 枚举类型的使用

1. 联合体类型的声明

像结构体一样,联合体也是由一个或者多个成员构成,这些成员可以不同的类型

但是编译器只为最大的成员分配足够的内存空间。联合体的特点是所有成员共用同一块内存空间。所以联合体也叫:共用体

给联合体其中一个赋值,其他成员的值也跟着变化

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

//联合类型声明
union u
{
	char c;
	int i;
};

int main()
{
	
	//联合变量的定义
	union u uu = { 0 };
	//计算变量的大小
	printf("%d\n", sizeof(uu));//4
	return 0;
}

最终的结果为什么是4呢?

在这里插入图片描述

2. 联合体的特点

联合的成员是共用同一块内存空间的,这样一个联合变脸的大小,至少是最大成员的大小(因为联合至少得有能力保存最大的那个成员)。

union Un
{
	char c;
	int i;
};

int main()
{
	union Un un = { 0 };
	printf("%p\n", &( un.c));
	printf("%p\n", &(un.i));
	printf("%p\n", &(un));
	return 0;
}

在这里插入图片描述

指向的地址都是同一个

3. 联合体大小的计算

  • 联合的大小至少是最大成员的大小
  • 当最大成员大小不是最大对齐数的整数倍时,就要对齐到最大对齐数的整数倍
union u1
{
	char c[5];//5
	int i;//4
};

union u2
{
	short c[7];//14
	int i;//4
};

int main()
{
	printf("%zd\n", sizeof(union u1));//8
	printf("%zd\n", sizeof(union u2));//16
}

使用联合体是可以节省空间的,举例:
比如:我们要搞一个活动,要上线一个礼品兑换单,礼品兑换单中有三种商品:图书、杯子、衬衫。
每一种商品都有:库存量、价格、商品类型和商品类型相关的其他信息

图书:书名、作者、页数
杯子:设计
衬衫:设计、可选颜色、可选尺寸

那我们不耐心思考,可以写出一下结构

struct gift
{
	//公共属性
	int num;//库存量
	int price;//价格
	char tyoe;//商品类型

	//特殊属性
	char title[20];//书名
	char author[10];//作者
	int pag_num;//页数

	char design[30];//设计
	int color;//可选颜色
	int sizes;//可选尺寸
};

上述的结构其实这几的很简单,用起来也方便,但是结构的设计包含了所有礼品中的各种属性,液氧使得结构体大小就会偏大,比较浪费内存。因为对于礼品兑换单中的商品来说,只有部分属性信息是常用的。比如:

商品是图书,就不需要desgin、color、sizes

所有我们就可以把公共属性单独写出来,剩余各种商品本身的属性使用联合体起来,这样就可以介绍所需的内存空间,一定程度上节省了内存。

struct gift
{
	//公共属性
	int num;//库存量
	int price;//价格
	char tyoe;//商品类型

	union
	{
		struct 
		{
			char title[20];//书名
			char author[10];//作者
			int pag_num;//页数
		}books;

		struct
		{
			char design[20];//设计
		}cup;

		struct
		{
			char design[20];//设计
			char color;//颜色
			int sizes;//尺寸
		}shirt;

	}all;
};

联合的一个练习

写一个程序,判断当前机器是大端?还是小端?

int mine()
{
	union 
	{
		int i;
		char c;
	}un;
	un.i = 1;
	return un.c;
}

int main()
{
	int ret = mine();
	if (ret == 1)
	{
		printf("小端");
	}
	else {
		printf("大端");
	}
	

4. 枚举类型的声明

枚举顾名思义就是一 一列举

把有可能的取值 一 一列举

比如我们现实生活中:
一周的星期一到星期日是有限的7天,可以一一列举
性别有:男、女、保密,也可以一一列举
三原色,也是可以一一列举的

这些数据的表示就可以使用枚举了。

//枚举的关键字
enum sex
{
	//这里列举枚举enum sex的可能取值
	//这些可能取值是常量,也叫枚举常量
	MALE,
	FEMALE,
	SECRET
};

int main()
{
	printf("%d\n", MALE);//0
	printf("%d\n", FEMALE);//1
	printf("%d\n", SECRET);//2

	enum sex s = MALE;
	return 0;
}

{}中的内容时枚举类型的可能取值,也叫枚举常量
这些可能取值都是有值得,默认从0开始,一次增1,当然在声明枚举类型的时候也可以赋初值

enum color
{
	RED=2,
	GREEN=4,
	BLUE=8
};

5. 枚举类型的优点

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

枚举的优点:

  1. 增加代码的可读性和可维护性
  2. 和#define定义的标识符比较枚举有类型检查,更加严谨
  3. 便于调试,预处理阶段会删除#define定义的符号
  4. 使用方便,一次可以定义多个常量
  5. 枚举常量是遵循作用域规则的,枚举声明在函数内,只能在函数内使用

6. 枚举类型的使用

enum color
{
	RED=2,
	GREEN=4,
	BLUE=8
};

enum color clr = BLUE;//使用枚举常量给枚举变量赋值

那是否可以拿整数给枚举变量赋值呢?在C语言中是可以的,但是在C++是不行的,C++的类型检查比较严格

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

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

相关文章

机器学习系列4-特征工程

机器学习系列4-特征工程 学习内容来自&#xff1a;谷歌ai学习 https://developers.google.cn/machine-learning/crash-course/framing/check-your-understanding?hlzh-cn 本文作为学习记录自己归纳整理的思维导图 这里写目录标题 机器学习系列4-特征工程一级目录二级目录三…

Mac利用brew安装mysql并设置初始密码

前言 之前一直是在windows上开发后段程序&#xff0c;所以只在windows上装mysql。(我记得linux只需要适应yum之类的命令即可) 另外, linux的移步 linux安装mysql (详细步骤,初次初始化,sql小例子,可视化操作客户端推荐) 好家伙&#xff0c;我佛了&#xff0c;写完当天网上发…

集群clickhouse使用和clickhouse索引的使用

ClickHouse支持多种索引类型&#xff0c;包括普通索引、范围索引、哈希索引、倒排索引等。使用索引可以加快查询速度和提高查询效率。下面是ClickHouse索引的一些使用方法&#xff1a; 1 普通索引 可以使用普通索引来加速查询特定的列&#xff0c;例如&#xff1a; CREATE TA…

MES生产制造管理:汽车零部件生产MES解决方案

某某汽车部件科技有限公司是一家铝合金零部件研发、压铸和精加工为一体的高新技术企业,拥有先进压铸、机加、检测等设备,并配套自动化生产线。为解决发动机支架等产品的全程生产质量追溯和实现机台设备联网,梅施科技提供了车间级的MES解决方案,如图所示&#xff1a; 梅施科技采…

Axios设置token到请求头的三种方式

1、为什么要携带token? 用户登录时&#xff0c;后端会返回一个token&#xff0c;并且保存到浏览器的localstorage中&#xff0c;可以根据localstorage中的token判断用户是否登录&#xff0c;登录后才有权限访问相关的页面&#xff0c;所以当发送请求时&#xff0c;都要携带to…

每日一题——LeetCode1408.数组中的字符串匹配

方法一 暴力枚举&#xff1a; 对每个单词循环判断是否是其他单词的子字符串 var stringMatching function(words) {const ret [];for (let i 0; i < words.length; i) {for (let j 0; j < words.length; j) {if (i ! j && words[j].search(words[i]) ! -1)…

探索Gin框架:Golang Gin框架请求参数的获取

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站https://www.captainbed.cn/kitie。 前言 我们在专栏的前面几篇文章内讲解了Gin框架的路由配置&#xff0c;服务启动等内容。 专栏地址&…

TS项目实战二:网页计算器

使用ts实现网页计算器工具&#xff0c;实现计算器相关功能&#xff0c;使用tsify进行项目编译&#xff0c;引入Browserify实现web界面中直接使用模块加载服务。   源码下载&#xff1a;点击下载 讲解视频 TS实战项目四&#xff1a;计算器项目创建 TS实战项目五&#xff1a;B…

Unity3D判断屏幕中某个坐标点的位置是否在指定UI区域内

系列文章目录 unity工具 文章目录 系列文章目录前言一、使用rect.Contains()判断1-1、转换坐标1-2、代码如下&#xff1a;1-3、注意事项1-3、测试效果如下 二、使用坐标计算在不在区域内2-1、方法如下&#xff1a;2-2、注意事项 三、使用RectTransformUtility.ScreenPointToLo…

[每日一题] 02.06 - ABC

ABC lis list(map(int,input().split())) ABC list(input()) lis.sort() dic {A:lis[0],B:lis[1],C:lis[2]} res print(dic) for i in ABC:print(dic[i],end )我感觉没问题&#xff0c;但提交就是出问题了&#xff0c;应该不是最后多了个空格&#xff08;试过去除还是错…

股票投资指南!石家庄开通股票账户佣金最低是多少?怎么开低佣金账户?

股票投资指南可以帮助您更好地了解股票投资的基本知识和技巧&#xff0c;以便您可以做出明智的投资决策。以下是一些股票投资的基本指南&#xff1a; 了解股票市场&#xff1a;学习股票市场的基本概念和运作方式&#xff0c;包括股票交易所、股票指数和股票价格等。 定义投资目…

技术是你的安身立命之本

技术是你的安身立命之本 技术是你的安身立命之本,这句话是我父亲说的,我也一直把这句话奉为圭臬。这句话让我受用至今。 我父亲是一个两面派人士,一面是农民,一直在耕种着五亩薄田,没有像别的人家一样把田租赁出去,另一面是银行职员,勤勤恳恳在小县城的网点干了一辈子…

【AI】告别繁琐阅读,阿里通义智文阅读助手带您轻松畅游知识海洋!

哈喽&#xff0c;大家好&#xff0c;我是木头左&#xff0c;致力于程序服务生活&#xff01; 一、阿里通义智文阅读助手简介 阿里通义智文阅读助手是一款基于人工智能技术的阅读辅助工具&#xff0c;可以帮助用户更高效地阅读和理解各种类型的文档&#xff0c;如PPT、图片和PD…

【多模态MLLMs+图像编辑】MGIE:苹果开源基于指令和大语言模型的图片编辑神器(24.02.03开源)

项目主页&#xff1a;https://mllm-ie.github.io/ 论文 :基于指令和多模态大语言模型图片编辑 2309.Guiding Instruction-based Image Editing via Multimodal Large Language Models &#xff08;加州大学圣巴拉分校苹果&#xff09; 代码&#xff1a;https://github.com/appl…

LeetCode-第2769题-找出最大的可达成数字

1.题目描述 给你两个整数 num 和 t 。 如果整数 x 可以在执行下述操作不超过 t 次的情况下变为与 num 相等&#xff0c;则称其为 可达成数字 &#xff1a; 每次操作将 x 的值增加或减少 1 &#xff0c;同时可以选择将 num 的值增加或减少 1 。 2.样例描述 3.思路描述 当 x…

第五讲 二维费用的背包问题

【题目来源】AcWing 8. 二维费用的背包问题 【题意分析】 本题在前面背包问题的基础上&#xff0c;增加了一个维度——质量&#xff0c;背包拥有了容积、承重两个限制&#xff0c;物品也有了体积、质量两种属性。 【参考资料】第一讲 0/1背包问题 与0/1背包类似&#xff0c;加…

PDF文件格式(一):交叉引用流

在PDF-1.5版本之前&#xff0c;对象的交叉引用信息是存储在交叉引用表(cross-reference table)中的。在PDF-1.5版本之后&#xff0c;引进了交叉引用流(cross-reference stream)对象&#xff0c;可以用它来存储对象的交叉引用信息&#xff0c;就像交叉引用表的功能一样。 采用交…

C语言第十九弹---指针(三)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 指针 1、数组名的理解 2、使用指针访问数组 3、⼀维数组传参的本质 4、冒泡排序 5、二级指针 6、指针数组 7、指针数组模拟二维数组 总结 1、数组名的理解…

C++学习Day04之常函数和常对象

目录 一、程序及输出1.1 常函数1.1.1 不能修改对象的成员变量1.1.2 常函数可以被常对象和非常对象调用 1.2 常对象1.2.1 对象的成员变量不能被修改1.2.2 只能调用常函数&#xff0c;不能调用非常函数1.2.3 const_cast 调用非常函数 1.3 常函数中或常对象修改成员变量 二、分析与…

070:vue+cesium: 利用canvas设置线性渐变色材质

第070个 点击查看专栏目录 本示例的目的是介绍如何在vue+cesium中设置线性渐变色的材质,这里使用canvas的辅助方法。 直接复制下面的 vue+cesium源代码,操作2分钟即可运行实现效果. 文章目录 示例效果配置方式示例源代码(共104行)专栏目标示例效果 配置方式 1)查看基础…