【零基础C语言】联合体(共用体)和枚举

news2024/9/29 15:35:19

目录

自定义类型:联合体(共用体)和枚举

1.自定义类型:联合体(共用体)

 1.1 联合体的声明

1.2 联合体的特点

​编辑1.3 联合体的大小计算 

 1.4使⽤联合体是可以节省空间的

 1.5使用联合体写一个程序判断机器是大端还是小端存储

 2.自定义类型:枚举

 2.1枚举的声明

 2.2 枚举变量的优点


自定义类型:联合体(共用体)和枚举

1.自定义类型:联合体(共用体)

 联合体和结构体一样,可以又一个或者多个成员组成,成员也可以是不同的类型但是这些成员是共用一块空间的。

 1.1 联合体的声明

union S
{
	char c;
	int i;
};

int main()
{
	union S s = { 0 };
	s.c = 1;
	printf("s.i = %d\n", s.i); // 1
	printf("sizeof(s) = %zd\n", sizeof(s)); // 4
	return 0;
}

 由于共用一块空间我们可以看到,我们赋值s.c,但是当我们打印s.i时依然是1。
 由于共用一块空间我们可以看到, 计算整个联合体类型s时大小为4。

1.2 联合体的特点

 联合的成员是共⽤同⼀块内存空间的,这样⼀个联合变量的⼤⼩,⾄少是最⼤成员的⼤⼩(因为联合⾄少得有能⼒保存最⼤的那个成员)。

union Un
{
	char c;
	int i;
};

int main()
{
	union Un u = { 0 };
	printf("&(u.c) = %p\n", &(u.c));
	printf("&(u.i) = %p\n", &(u.i));
	printf("&u     = %p\n", &u);
	return 0;
}
// 存储地址一样

union Un
{
	char c;
	int i;
};

int main()
{
	union Un u = { 0 };
	u.i = 0x11223344;
	printf("u.i = %x\n", u.i);
	printf("u.c = %x\n", u.c);
	return 0;
}
// 小端存储,共用空间

1.3 联合体的大小计算 

  •  联合的⼤⼩⾄少是最⼤成员的⼤⼩。
  • 当最⼤成员⼤⼩不是最⼤对⻬数的整数倍的时候,就要对⻬到最⼤对⻬数的整数倍。

#include <stdio.h>
union Un1
{               //大小    个数
	char c[10]; // 1   -   10
	int i;      // 4   -   1
}; 
union Un2
{              // 大小     个数
	short c[3];//  2   -   3
	int i;     //  4   -   1
};
int main()
{
	//下⾯输出的结果是什么?
	printf("%zd\n", sizeof(union Un1)); //12
	printf("%zd\n", sizeof(union Un2)); //8
	return 0;
}

 1.4使⽤联合体是可以节省空间的

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

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 size; //尺寸
		}shirt;

	}item;

};

 1.5使用联合体写一个程序判断机器是大端还是小端存储

int check()
{
	union U
	{
		char c;
		int i;
	};
	union U u = { 0 };
	u.i = 1;
	return (u.c);
}

int main()
{
	int ret = check();
	if (ret == 1)
	{
		printf("小端\n");
	}
	else
	{
		printf("大端\n");
	}
	return 0;
}

 2.自定义类型:枚举

  • 枚举顾名思义就是⼀⼀列举。
  • 把可能的取值⼀⼀列举。
  • ⽐如我们现实⽣活中:
  • ⼀周的星期⼀到星期⽇是有限的7天,可以⼀⼀列举
  • 性别有:男、⼥、保密,也可以⼀⼀列举
  • ⽉份有12个⽉,也可以⼀⼀列举
  • 三原⾊,也是可以意义列举

 2.1枚举的声明

enum Colcor //颜色
{
	RED,
	BLUE,
	GREEN
};
// 枚举类型 - enum Colcor

// RED,BLUE,GREEN 属于枚举变量

//枚举变量的值默认从0开始,依次递增1,当然在声明枚举类型的时候也可以赋初值。

 2.2 枚举变量的优点

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

//题目:

//1.下面代码的结果是:
enum ENUM_A
{
	X1,
	Y1,
	Z1 = 255,
	A1,
	B1,
};
int main()
{
	enum ENUM_A enumA = Y1;
	enum ENUM_A enumB = B1;
	printf("enumA = %d\nenumB = %d\n", enumA, enumB);
	return 0;
}

//因为枚举变量默认从0开始,X1=0,Y1=1,

//但是Z1 = 255,所有后面从255开始数起, A1=256,B1=257。 

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

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

相关文章

详解|temu选品师是什么?算蓝海项目吗?

在快速发展的跨境电商行业中&#xff0c;temu选品师这一岗位逐渐受到人们的关注。temu作为拼多多旗下的跨境电商平台&#xff0c;致力于为中国商家提供一个通向全球市场的桥梁。而temu选品师&#xff0c;则是这个桥梁上不可或缺的角色。 temu选品师主要负责在海量商品中挑选出具…

探索Zalo:从社交APP到Mini App开发指南

1.Zalo是什么&#xff1f; Zalo是一款源自越南的即时通讯和社交软件&#xff08;相当于国内的微信&#xff09;&#xff0c;由越南VNG公司开发。它集成了多种功能&#xff0c;包括但不限于免费的文字、语音、视频消息发送&#xff0c;高质量的语音和视频通话&#xff0c;群聊功…

电子电器架构 —— 诊断数据DTC具体故障篇

电子电器架构 —— 诊断数据DTC起始篇 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师 (Wechat:gongkenan2013)。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 本就是小人物,输了就是输了,不要在意别人怎么看自己。江湖一碗茶,喝完再挣扎…

批量重命名文件名,批量管理文件,复制后轻松删除原文件

在现代工作中&#xff0c;我们经常需要处理大量的文件&#xff0c;无论是工作文档、图片还是视频资料。对于很多人来说&#xff0c;文件管理是一项繁琐且耗时的任务。不过&#xff0c;现在有一种高效的文件管理方法&#xff0c;可以帮助你轻松复制文件后删除原文件夹&#xff0…

Redis入门到实战-第四弹

Redis实战热身Strings 篇 完整命令参考官网 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列内容不一定100%复现, 还要以官方信息为准 https://redis.io/Redis概述 Redis是一个开源的&#xff08;采用BSD许可证&#xff09;&#xff0c;用作数据库、缓存、消息代理…

鸿蒙开发学习【地图位置服务组件】

简介 移动终端设备已经深入人们日常生活的方方面面&#xff0c;如查看所在城市的天气、新闻轶事、出行打车、旅行导航、运动记录。这些习以为常的活动&#xff0c;都离不开定位用户终端设备的位置。 当用户处于这些丰富的使用场景中时&#xff0c;系统的位置定位能力可以提供…

解析服务器出现大量 TIME_WAIT 和 CLOSE_WAIT 状态的原因及排查方法

服务器出现大量 TIME_WAIT 状态的原因有哪些&#xff1f; 首先要知道 TIME_WAIT 状态是主动关闭连接方才会出现的状态&#xff08;别陷入一个误区不是只有客户端才能主动关闭连接的&#xff09;&#xff0c;所以如果服务器出现大量的 TIME_WAIT 状态的 TCP 连接&#xff0c;就是…

分布式组件 Nacos

1.在之前的文章写过的就不用重复写。 写一些没有写过的新东西 2.细节 2.1命名空间 &#xff1a; 配置隔离 默认&#xff1a; public &#xff08;默认命名空间&#xff09;:默认新增所有的配置都在public空间下 2.1.1 开发 、测试 、生产&#xff1a;有不同的配置文件 比如…

关于mysql无法添加中文数据的问题以及解决方案

往数据库表插入语句时&#xff0c;插入中文字段&#xff0c;中文直接变成&#xff1f;的问题&#xff0c; 出现这样的问题就是在创建数据库时 数据库字符集 没有选择uft8, 数据库校对规则没有选择utf8-bin 用 SHOW CREATE DATABASE 数据名; 可以查看你的这个数据库的定义…

设计模式之状态模式(一)

设计模式专栏&#xff1a; http://t.csdnimg.cn/4Mt4u 目录 1.概述 2.结构 3.实现 4.总结 1.概述 状态模式( State Pattern)也称为状态机模式( State Machine pattern), 是允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类, 属于行为型模式。 在状…

<商务世界>《第16课 餐桌礼仪之座次》

1 简要 我国自古以来就很重视座位礼仪&#xff0c;非讲究&#xff0c;分君臣、分宾主、分方位等等而今座位礼仪已经简化为&#xff1a; 以“中”为尊&#xff1a; 中心为尊&#xff0c;突出主位。 以“右”为尊&#xff1a; 从历史上到国际上都是以右为尊。 以“内”为尊&…

算法导论第十四章练习参考答案(26) - 14.1-14.3

Exercise 14.1-1 呼叫顺序为: OS−SELECT(T.root,10) OS−SELECT(T.root.left&#xff0c;10) OS−SELECT(T.root.left.right&#xff0c;2) OS−SELECT(T.root.left.right.left&#xff0c;2) OS−SELECT(T.root.left.right.left.right&#xff0c;1) 然后&#xff0c;我们得到…

UKP3d的协同设计相关问题

用户在用UKP3d多人协同设计&#xff0c;反映以前保存的内容为什么没有呢&#xff1f; 经查&#xff0c;协同设计的某一用户并没有打开协同去用。如A,B两人协同设计&#xff0c;B并不是用“打开—协同项目”&#xff0c;而是用“打开—项目”&#xff0c;当B保存项目的时候&…

RelativeContainer踩坑--子控件消失

使用android的RelativeLayout时&#xff0c;靠左靠上的子控件&#xff0c;我通常不会去声明它和父布局的约束关系。 结果这个方法用到鸿蒙RelativeContainer上出了问题&#xff0c;当我写第一个子控件时&#xff0c;没有声明与父布局的约束关系&#xff0c;显示是OK的 Relati…

NX二次开发-调内部函数创建进度条MT_create_progress_bar

一、概述 最近学习NX二次开发&#xff0c;看到NX打开装配模型或者加载模型时会显示进度条的问题&#xff0c;个人觉得很有意思&#xff0c;然后参考阿飞2018中的文章进行学习。 二、代码解析 //User Defined Header File#include <uf.h>#include <uf_ui.h>#includ…

Zookeeper(八)序列化与协议

目录 一 序列化与反序列化1.1 Jute序列化工具1.1 Recor接口1.2 OutputArchive和InputArchive 二 通信协议2.1 请求部分2.1.1 请求头2.2.2 请求体2.1.3 案例分析 2.2 响应部分2.2.1 响应头2.2.2 响应内容2.2.3 案例分析 官网&#xff1a;Apache ZooKeeper 一 序列化与反序列化 …

vivado 查看消息、增量编译消息、查看实施报告

查看消息 重要&#xff01;查看所有消息。这些信息可能会建议如何改进您的设计性能、功率、面积和布线。严重警告还可能暴露时间限制问题必须解决。 以非项目模式查看消息 在非项目模式下&#xff0c;查看Vivado日志文件&#xff08;Vivado.log&#xff09;中的以下内容&…

QToolButton 设置图标变灰

1、目的 使用一张图片来实现QToolButton控件两种状态&#xff08;ON和OFF状态&#xff09;的图标。前提不能使用两张图片&#xff0c;也不能使用setEnable来图标变灰&#xff0c;因为当设置了false之后&#xff0c;控件将不能再切换了。 2、方法 知道可以通过QToolButton有s…

Python编程—Ajax数据爬取

Python编程—Ajax数据爬取 ​ 在浏览器中可以看到正常显示的页面数据&#xff0c;而使用requests得到的结果中并没有这些数据。这是因为requests获取的都是原始HTML文档&#xff0c;而浏览器中的页面是JavaScript处理数据后生成的结果&#xff0c;这些数据有多种来源&#xff…

Docker(二):Docker常用命令

docker 查看docker支持的所有命令和参数。 ➜ ~ docker Management Commands:config Manage Docker configscontainer Manage containersimage Manage imagesnetwork Manage networksnode Manage Swarm nodesplugin Manage pluginssecret …