联合体和枚举<C语言>

news2024/12/24 23:59:40

导言

        在C语言中除了结构体外,联合体和枚举也是自定义类型,联合体主要用于节省空间,在同一块内存存储多种类型的数据,而枚举可以提高代码的可读性、可维护性。


联合体(union)

它还有个更容易理解的名字:“共用体”,它有多个成员,成员可以为不同类型,但是编译器只会给最大的成员分配内存空间,所有成员共用一块空间。

联合体的创建
//联合体的创建
union un {
	int x;
	int y;
};
int main() {
	union un tmp = { 0 };
	return 0;
}

 联合体的初始化

联合体的初始化只能对整个联合体进行初始化,因为所有联合成员共用一块内存,初始化后所有的成员都是这个值,不管成员类型是否一致。

联合体的访问与结构体一致,这里不再介绍

联合体的大小

联合体大小计算规则:

●联合体大小最少为最大成员的大小

●当最大成员的大小不为最大对齐数的整数倍时,联合体大小要对齐到最大对齐数的整数倍

示例:

 值得注意的是:在计算数组的对齐数时,与默认数比较的不是整个数组的大小,而是数组单个元素的大小。

联合体的运用

1.假如一家商店要进一批货,分别为书、卡牌、玩具。这三样物品都有公共属性和私有属性

公共属性:进货量、价格、生产年份

私有属性:

●书:作者、页数、版号

●卡牌:形状(圆或方)

●玩具:颜色、尺寸

使用结构体定义:

struct goods {
	//公共属性:进货量、价格、生产年份
	int count;
	int price;
	int year;

	//私有属性:
	//书:作者、页数、版号
	char name[20];
	int pages;
	int vn;

	//卡牌:形状(圆或方)
	int shape;

	//玩具:颜色、尺寸
	char color[10];
	int size;

};//占用空间60字节

使用联合体定义:

struct goods {
	//公共属性:进货量、价格、生产年份
	int count;
	int price;
	int year;

	//私有属性:
	union {
		struct {
			//书:作者、页数、版号
			char name[20];
			int pages;
			int vn;
		}book;
		struct {
			//卡牌:形状(圆或方)
			int shape;
		}card;
		struct {
			//玩具:颜色、尺寸
			char color[10];
			int size;
		}toy;
	}item;
};//占用空间40字节

 在这个例子中使用结构体占用了60字节,使用联合体却只用了40字节,第二种方法声明比较复杂,我们怎么来对它进行初始化呢?

struct goods {
	//公共属性:进货量、价格、生产年份
	int count;
	int price;
	int year;

	//私有属性:
	union {
		struct {
			//书:作者、页数、版号
			char name[20];
			int pages;
			int vn;
		}book;
		struct {
			//卡牌:形状(圆或方)
			int shape;
		}card;
		struct {
			//玩具:颜色、尺寸
			char color[10];
			int size;
		}toy;
	}item;
};//占用空间40字节
int main() {
	struct goods goods_1 = { 10,30,2005,.item.book = {"yuhua",200,1998} };
	//这里初始化了结构体goods中,公共属性中的进货量、价格、生产年份,
	// 以及联合体item中的结构体book三个成员:作者、页数、版号
	return 0;
}

2.通过联合体其数据类型互换的特性,完成对大小端字节序的判断

union un {
	char a;
	int b;
	//定义一个拥有char型和int型的联合体,来观察其大小端字节序
};
int main() {
	union un un1 = { 0x11223344 };
	//存入16进制数0x11223344来观察,小端存储:0X44332211、大端存储:0X11223344
	printf("%#X", un1.a);//使用联合体成员char a,来打印第一个字节内容来观察大小端
	return 0;
}

运行结果:

小端存储。


枚举(enum)

枚举顾名思义:一一列举。

我们可以为一组数值定义相同类型的符号名(枚举常量),如:

周一到周日、一月到十二月、三原色等。

枚举的创建
//枚举的创建
enum en {
	monday,//注意枚举常量后面是“,”逗号,从0开始
	tuesday,
	wednesday,
	thursday,
	friday,
	saturday,
	sunday,
};

 枚举常量在创建时是有初值的,默认从0开始,步长为1.

也可更改:

枚举的声明以及使用

 

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

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

相关文章

Triton学习笔记

b站链接:合集Triton 从入门到精通 文章目录 算法名词解释:scheduler 任务调度器model instance、inference和requestbatching 一、Triton Inference Server原理1. Overview of Trition2. Design Basics of Trition3. Auxiliary Features of Trition4. A…

C语言:定义和使用结构体变量

定义和使用结构体变量 介绍基础用法1.定义结构体2. 声明结构体变量3. 初始化和访问结构体成员4. 使用指针访问结构体成员5. 使用结构体数组 高级用法6. 嵌套结构体7. 匿名结构体8. 结构体和动态内存分配9. 结构体作为函数参数按值传递按引用传递 介绍 在C语言中,结…

找出链表倒数第k个元素-链表题

LCR 140. 训练计划 II - 力扣(LeetCode) 快慢指针。快指针臂慢指针快cnt个元素到最后; class Solution { public:ListNode* trainingPlan(ListNode* head, int cnt) {struct ListNode* quick head;struct ListNode* slow head;for(int i …

抓住时机的核心:坚持学习准备着

在这个快节奏的时代,时间对于每个人来说都是宝贵的。能否在合适的时间做正确的事情,往往决定了我们成功的概率。但同时,我们也要认识到,逆风翻盘虽少,却并非不可能。在这个过程中,投资自己,投资…

【python】错误SyntaxError: invalid syntax的解决方法总结

解决Python报错:【Python】错误SyntaxError: invalid syntax的解决方法总结 SyntaxError是Python编程中常见的错误之一,它表明代码中有语法错误。这种错误可能由多种原因引起,包括但不限于拼写错误、错误的缩进、缺少括号等。本文将介绍几种常…

1-什么是护网行动

1.什么是护网行动 2016年,公安部会同民航局、国家电网组织开展了“护网2016”网络安全攻防演习活动。同年,《网络安全法》颁布,出台网络安全演练相关规定:关键信息基础设施的运营者应“制定网络安全事件应急预案,并定期进行演练”…

LeetCode338比特位计数

题目描述 给你一个整数 n &#xff0c;对于 0 < i < n 中的每个 i &#xff0c;计算其二进制表示中 1 的个数 &#xff0c;返回一个长度为 n 1 的数组 ans 作为答案。 解析 动态规划&#xff0c;将当前的数的最后一位去掉&#xff0c;然后判断去掉的最后一位是0还是1。…

展会邀请 | 龙智即将亮相2024上海国际嵌入式展,带来安全合规、单一可信数据源、可追溯、高效协同的嵌入式开发解决方案

2024年6月12日至14日&#xff0c;备受全球嵌入式系统产业和社群瞩目的2024上海国际嵌入式展&#xff08;embedded world china 2024&#xff09;即将盛大开幕&#xff0c;龙智将携行业领先的嵌入式开发解决方案亮相 640展位 。 此次参展&#xff0c;龙智将全面展示专为嵌入式行…

类似crossover的容器软件有哪些 除了crossover还有什么 Mac虚拟机替代品

CrossOver是Mac用来运行exe文件的一款软件&#xff0c;但是并不是所有的exe文件CrossOver都支持运行。想要在Mac上运行exe文件的方法并不是只有使用CrossOver这一种&#xff0c;那么有没有类似的软件也可以实现exe文件在Mac上运行呢&#xff1f; CrossOver类似软件有哪些 1、Pl…

[Cloud Networking] Layer 2

文章目录 1. 什么是Mac Address?2. 如何查找MAC地址&#xff1f;3. 二层数据交换4. [Layer 2 Protocol](https://blog.csdn.net/settingsun1225/article/details/139552315) 1. 什么是Mac Address? MAC 地址是计算机的唯一48位硬件编码&#xff0c;嵌入到网卡中。 MAC地址也…

Spring Boot 实现动态数据源配置

前言 之前在CSDN博客以及某站看了教程&#xff0c;不免觉得有点不知如何下手&#xff0c;好在最后融合了以下&#xff0c;得出了一个比较简单的配置动态数据源的过程。 首先项目是Spring Boot的单体项目&#xff0c;我们的需求是要连接多个数据库&#xff0c;那么就需要配置多个…

CleanMyMac2028永久破解版苹果mac电脑垃圾清理软件

CleanMyMac&#xff0c;这款苹果mac电脑垃圾清理软件简直就是我的救星啊&#xff01;以前总是被电脑上的各种垃圾文件困扰&#xff0c;不知道如何彻底清理。自从用了CleanMyMac&#xff0c;我的电脑就像重新获得了新生一样&#xff01; 它的功能强大到让我惊叹不已&#xff01;…

深度学习复盘与论文复现C

文章目录 4、Distributed training4.1 GPU architecture 5、Recurrent neural network5.1 The basic structure of RNN5.2 Neural networks without hidden states5.3 Recurrent neural networks with hidden states5.4 summary 6、Language Model Dataset (lyrics from Jay Ch…

Java 泛型类,泛型方法,泛型接口和通配符(用来限定类和方法的使用范围)

测试类 package Genericity;import java.util.ArrayList;public class test {public static void main(String[] args) {// 使用泛型方法添加元素ArrayList<String> list new ArrayList<>();MyToolClass.ListAdd(list,"fdsf","dsfa");System…

Unity协程学习心得

前言 个人总结的一些Unity协程学习心得&#xff0c;如有不对请在评论区指出一起学习&#xff01;感谢。 在Unity编程中谈到异步逻辑&#xff0c;可以考虑使用协程来实现。协程&#xff08;Coroutine&#xff09;在Unity中的主要作用就是把一个任务暂停&#xff08;挂起&#…

动态IP在云计算中的应用与优势(短效IP的作用)

一、云计算概述 云计算是指通过互联网将计算资源和服务提供给用户的一种模式。它具有高灵活性、可扩展性和成本效益等特点&#xff0c;使得企业能够快速响应市场变化&#xff0c;降低IT投入成本。云计算的核心优势在于其资源的动态分配和高效利用。 二、动态IP在云计算中的角…

动态IP基础解析:为什么我们需要它?

在深入探讨互联网世界的运作机制时&#xff0c;IP地址无疑是其核心要素之一。IP地址&#xff0c;作为网络设备的唯一标识&#xff0c;不仅确保了数据的准确传输&#xff0c;更是网络安全和管理的基石。本文将深入解析动态IP的基础知识&#xff0c;并探讨其重要性及在多种场景下…

dos命令---根据端口查找进程

简介 在日常开发中&#xff0c;常常出现端口被占用的情况&#xff0c;导致程序运行报错&#xff0c;这时可以使用此命令查看哪个进程占用了端口 命令 netstat -ano | findstr 11434返回结果&#xff1a;

使用React和GraphQL进行CRUD:完整教程与示例

在本教程中&#xff0c;我们将向您展示如何使用GraphQL和React实现简单的端到端CRUD操作。我们将介绍使用React Hooks读取和修改数据的简单示例。我们还将演示如何使用Apollo Client实现身份验证、错误处理、缓存和乐观UI。 什么是React&#xff1f; React是一个用于构建用户…

OpenCompass 大模型评测作业(lesson 7)

书生浦语大模型实战系列文章目录 书生浦语大模型全链路开源体系发展历程和特点&#xff08;lesson 1&#xff09; 部署 InternLM2-Chat-1.8B&#xff08;lesson 2-1&#xff09; 部署八戒demo InternLM2-Chat-1.8B&#xff08;lesson 2-2&#xff09; 部署InternLM2-Chat-7B 模…