C语言自定义类型联合和枚举(25)

文章目录

  • 前言
  • 一、联合体
    • 联合体的声明
    • 联合体的特点
    • 联合体和结构体内存布局对比
    • 联合体的大小计算
    • 联合体的实际使用样例
      • 礼品兑换单
      • 判断当前机器是大端还是小端
  • 二、枚举
    • 枚举的定义
    • 枚举类型的声明
    • 枚举类型的优点
    • 枚举类型的使用
  • 总结


前言

  关于自定义类型除了我们常用的结构体,其实还有联合与枚举也是属于自定义类型
  我们也来学习一下吧!


一、联合体

联合体的声明

联合体是一个或多个成员组成,其中成员可以是不同类型,并且所有成员共用同一块内存空间,所以联合体也称为共用体。联合体声明的关键字是union

//联合体类型的声明
union Un
{// 1 + 4 == 5 吗?char c; // 1int i; // 4
};
int main()
{union Un un;// 联合体的定义sizeof("%zd\n,sizeof(un)"); // 4return 0;
}

联合体的特点

  1. 联合体所有成员共用同一块内存空间,一个联合体变量的大小,至少是最大成员的大小,编译器只为最大的成员分配足够大的空间
  2. 给联合体其中一个成员赋值,其他成员的值也会变化

我们不妨来两段代码来详细感受一下这个性质:

// 代码一
union Un
{char c;int i;
};int main()
{union Un un = {0};// 下⾯输出的结果是⼀样的吗?// 结果:001AF85C//      001AF85C//	    001AF85Cprintf("%p\n", &(un.i));printf("%p\n", &(un.c));printf("%p\n", &un);return 0;
}
// 代码二
union Un
{char c;int i;
};int main()
{union Un un = {0};un.i = 0x11223344;un.c = 0x55;// 结果:11223355printf("%x\n", un.i);return 0;
}

如果用一幅图来说明,那就是如下:
在这里插入图片描述
从代码一输出的结果是相同的,说明联合体中成员变量是一块空间存储
从代码二输出中,第四个字节的内容被修改位55,对联合体中成员赋值,会影响联合体的全部成员,char类型只占用一个字节

还记得前面的内容不,请在十秒内说出这是小端存储还是大端存储?
答案是小端!

联合体和结构体内存布局对比

我们再来比较一下同样成员变量情况下,两种结合方式的区别来加深印象:

struct Su
{char c;int i;
}S;Union Un
{char c;int i;
}un;

在这里插入图片描述

结构体是通过以为空间换取时间设计,而联合体是节省空间

联合体的大小计算

  1. 联合体的大小至少是最大成员的大小
  2. 当最大成员大小(联合体总大小)要对齐到最大对齐数的整数倍

请注意,很多学习资料都说联合体的大小就是最大成员的大小,其实这是不对的!
事实上,联合体也是有内存对齐的,下面我们就来举例说明

#include <stdio.h>union Un1
{char c[5]; int i; 
}; // 最大对齐数位4,最大成员大小为5,对齐到8是最大对齐数的整数倍union Un2
{short c[7];int i;
}; // 最大对齐数位4,最大成员大小为7,对齐到16是最大对齐数的整数倍int main()
{printf("%zd\n", sizeof(union Un1)); // 8printf("%zd\n", sizeof(union Un2)); // 16return 0;
}

联合体的实际使用样例

礼品兑换单

事实上你可以观察下这种做法,把公共属性单独写出来,剩余属于各种商品本身的属性使用联合体处理,其实是在一定程度上节省了内存

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;
};

判断当前机器是大端还是小端

这算是一个巧思,很妙,因为联合体公用一个空间,相当于我是把一个int变量的第一个字节的数据单独提取出来,如果最后返回的是1,那说明低字节位放数据低位,事实也确实是这样,也就说明小端是答案

union un
{char c;int i;
};bool check_sys()
{union un u;u.i = 0x00000001;return u.c;
}int main()
{if (check_sys()){printf("小端\n"); // YES}else printf("大端\n");return 0;
}

二、枚举

枚举的定义

枚举顾名思义就是一一列举,而列举可能的取值是用于定义一组具有离散值的常量,使数据更简洁、方便使用,关枚举的关键字enum

枚举类型的声明

enum Day
{Mon,Tues,Wed,Thur,Fri,Sat,Sun
};enum Sex
{Man,Woman;
}

以上定义的enum Day、enum Sex都是枚举类型,而{ }中枚举类型的可能取值称为枚举常量

枚举类型的优点

我么可以用宏来定义常量,那么这里为什么还要单独设立一种数据类型呢?

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

枚举类型的使用

enum Color
{Red=2,Blue=1
}enum Color clr = Blue;

enum Color clr = 2;
这种写法可以么,毕竟2也是Red的值,应该支持隐式类型转换吧!
嗯…最好不要,C语言可以;Cpp不行,Cpp检查比较严格

那有没有具体一点的应用场景呢?
有,我们稍微回顾一下之前的扫雷
在这里插入图片描述
运用了枚举这个技巧后:

在这里插入图片描述

关于枚举其实我们后来还会有很多的应用场景,这就需要大家自己去慢慢发现了!


总结

  其实中途跳过去写Cpp了,现在再跳回来…
  反复横跳!

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

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

相关文章

DBMS-3.1 SQL(1)——SQL概述和DDL

本文章的素材与知识来自李国良老师和王珊老师。 SQL概述 1.定义 2.SQL语句分类 数据定义语言DDL&#xff08;Data Definition Language&#xff09; 一.表 1.创建表 &#xff08;1&#xff09;语法 中括号内的项为可选项。分号标志着一条SQL语句的结束。SQL语句不区分大小…

前端编程艺术(4)---JavaScript进阶(vue前置知识)

目录 1.变量和常量 2.模版字符串 3.对象 4.解构赋值 1.数组的解构 2.对象的解构 5.箭头函数 6.数组和对象的方法 7.扩展运算符 8.Web存储 9.Promise 10.AsyncAwait 11.模块化 1.变量和常量 JavaScript 中的变量和常量是用于存储数据的标识符。变量可以被重新赋值&am…

PAIRDISTILL: 用于密集检索的成对相关性蒸馏方法

在当今海量数据时代,有效的信息检索(IR)技术对于从庞大数据集中提取相关信息至关重要。近年来,密集检索技术展现出了相比传统稀疏检索方法更加显著的效果。 现有的方法主要从点式重排序器中蒸馏知识,这些重排序器为文档分配绝对相关性分数,因此在进行比较时面临不一致性的挑战…

CSP-J Day 5 模拟赛补题报告

姓名&#xff1a;王胤皓&#xff0c;校区&#xff1a;和谐校区&#xff0c;考试时间&#xff1a; 2024 2024 2024 年 10 10 10 月 5 5 5 日 9 : 00 : 00 9:00:00 9:00:00~ 12 : 30 : 00 12:30:00 12:30:00&#xff0c;学号&#xff1a; S 07738 S07738 S07738 请关注作者的…

计算机系统基础概述

什么是计算机&#xff1f; 计算机是一种利用电子技术进行信息处理的设备&#xff0c;它能够接收、存储、处理和提供数据。计算机通过执行一系列预定义的指令来处理数据&#xff0c;这些指令通常被称为程序。计算机的核心功能包括算术运算、逻辑判断、数据存储和信息检索 计算…

IDEA基础开发配置以及和git的联动

1.1方向一&#xff1a;工具介绍 我今天要介绍的就是学习Java大部分情况下都会选择的一款工具-----IDEA&#xff0c;这个和我们熟悉的这个pycharm一样&#xff0c;都是属于这个Jetbrains公司的&#xff0c;虽然我对于这个并不是很了解&#xff0c;但是确实知道一点&#xff0c;…

七、泛型数组集合类

泛型&数组&集合类 泛型定义官方高阶扩展函数协变与逆变*泛型界限*类型擦除* 数组数组的创建数组的使用可变长参数原生类型数组嵌套数组 集合类List集合Set集合Map集合迭代器集合与数组扩展操作序列 泛型 定义 为了统计学生成绩&#xff0c;要求设计一个Score对象&…

25游卡(服务器)面试经验 游卡最常见面试问题总结

目录 【面试经历】 问题+详细答案 面试流程 面试攻略 【面试经历】 秋招目前面了十多家,第一家不开摄像头且表示麦不好要求找个耳机的。贴面经(纯八股) 1.HTTP与HTTPS 2.MTU如何设置,过大过小的后果 3.DNS过程 4.如何创建进程/线程,孤儿进程 5.java从文件到运行的过程…

LinuxO(1)调度算法

概念 在Linux中&#xff0c;O(1)调度算法是一种进程调度算法。O(1)表示算法的时间复杂度是常数级别的&#xff0c;与系统中的进程数量无关。 运行队列结构 他采用了两个运行队列&#xff0c;一个活动队列和一个过期队列。活动队列中的进程是有资格获取CPU时间片的进程&#x…

进程概念 | 进程状态 | 进程优先级

进程的基本概念 课本概念&#xff1a;程序的一个执行实例&#xff0c;正在执行的程序等。核心观点&#xff1a;担当分配系统资源&#xff08;cpu时间、内存&#xff09;的实体。 资源占用 它占用系统资源向CPU时间&#xff0c;内存等不同进程的资源是相互隔离的&#xff0c;确…

X3U·可编程控制器的定位控制

FX3U可编程控制器的定位控制进行说明。 一、概要 FX3U可编程控制器可以向伺服电机、步进电机等输出脉冲信号&#xff0c;从而进行定位控制。 脉冲频率高的时候&#xff0c;电机转得快:脉冲数多的时候&#xff0c;电机转得多。用脉冲频率、脉冲数来设定定位对象…

【牛顿迭代法求极小值】

牛顿迭代法求极小值 仅供参考 作业内容与要求 作业内容 作业要求 递交报告 代码 编程实现 计算偏导数 故上述非线性方程组的根可能为 f ( x , y ) f(x, y) f(x,y)的极值点&#xff0c;至于是极小值点还是极大值点或鞍点&#xff0c;就需要使用微积分中的黑塞矩阵来判断了。…

25重庆长安深蓝控制器开发面试经验 深蓝最常见面试问题总结

【面试经历】 秋招气氛组选手的第一场面试,9.17网申,9.24电话约面,9.26线上面试。问得很细,全长约1个小时 1. 自我介绍、项目介绍 2.项目细节,遇到了哪些困难;有没有PCB设计经验DC-DC芯片选型,电源噪声的原因、怎么消除、 3.画BUCK和BOOST拓扑图,讲原理 4.了解MCU的主…

C(十三)for、while、do - while循环的抉择 --- 打怪闯关情景

前言&#xff1a; 继C&#xff08;十&#xff09;for循环 --- 黑神话情景之后&#x1f449; https://blog.csdn.net/2401_87025655/article/details/142684637 今天&#xff0c;杰哥想用一个打怪闯关的场景让与大家一起初步认识一下for、while、do - while循环的抉择。&#xf…

【FPGA开发】Modelsim如何给信号分组

前面已经发布过了一篇关于 Modelsim 的入门使用教程&#xff0c;针对的基本是只有一个源文件加一个仿真tb文件的情况&#xff0c;而实际的工程应用中&#xff0c;往往是顶层加多个底层的源文件结构&#xff0c;如果不对信号进行一定的分组&#xff0c;就会显得杂乱不堪&#xf…

一个真实可用的登录界面!

需要工具&#xff1a; MySQL数据库、vscode上的php插件PHP Server等 项目结构&#xff1a; login | --backend | --database.sql |--login.php |--welcome.php |--index.html |--script.js |--style.css 项目开展 index.html&#xff1a; 首先需要一个静态网页&#x…

【深度学习】— 多层感知机介绍、 隐藏层、从线性到非线性、线性模型的局限性

【深度学习】— 多层感知机介绍 4.1 多层感知机4.1.1 隐藏层线性模型的局限性引入隐藏层 4.2 从线性到非线性线性组合的局限性引入非线性堆叠更多隐藏层 4.1 多层感知机 在第 3 节中&#xff0c;我们介绍了 softmax 回归&#xff0c;并实现了其从零开始的实现和基于高级 API 的…

MFC多媒体定时器实例(源码下载)

用MFC多媒体定时器做一个每1秒钟加一次的计时器&#xff0c;点开始计时按钮开始计时&#xff0c;点关闭计时按钮关闭计时。 1、在库文件Med_timeDlg.h文件中添加代码 class CMed_timeDlg : public CDialog { // Construction public:CMed_timeDlg(CWnd* pParent NULL); // st…

EEPROM读写实验——FPGA学习笔记18

一、EEPROM简介 Electrically Erasable Progammable Read Only Memory:是指带电可擦可编程只读存储器&#xff0c;是一种常用的非易失性存储器&#xff08;掉电数据不丢失&#xff09; EEPROM发展历史 我们这次实验所用的AT24C64存储容量为64Kbit&#xff0c;内部分成256页&am…

成都睿明智科技有限公司真实可靠吗?

在这个日新月异的电商时代&#xff0c;抖音作为短视频与直播电商的佼佼者&#xff0c;正以前所未有的速度重塑着消费者的购物习惯。而在这片充满机遇与挑战的蓝海中&#xff0c;成都睿明智科技有限公司以其独到的眼光和专业的服务&#xff0c;成为了众多商家信赖的合作伙伴。今…