【C语言】自定义类型:联合与枚举的简明概述

请添加图片描述
🔥引言

关于自定义类型除了我们常用的结构体,还有联合与枚举也是属于自定义类型。本篇将简单介绍联合与枚举基本概念和使用方法

请添加图片描述

Alt

🌈个人主页:是店小二呀
🌈C语言笔记专栏:C语言笔记
🌈C++笔记专栏: C++笔记

🌈喜欢的诗句:无人扶我青云志 我自踏雪至山巅
请添加图片描述

文章目录

  • 一、联合体(Union)
    • 1.1 联合体的声明
    • 1.2 联合体的特点
    • 1.3 结构体和联合体内存布局对比
    • 1.4 计算联合体的大小
    • 1.5 联合体的实际使用样例
  • 二、Enum(枚举)
    • 2.1 枚举类型的声明
    • 2.2 枚举类型的优点
    • 2.3 枚举类型的使用


一、联合体(Union)

1.1 联合体的声明

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

//联合体类型的声明
union Un
{
    char c;
    int i;
};
int main()
{
    union Un un;//联合体的定义
    sizeof("%d\n,sizeof(un)");-->4
    return 0;
}

1.2 联合体的特点

联合体的特点:

  • 联合体所有成员共用同一块内存空间,一个联合体变量的大小,至少是最大成员的大小,编译器只为最大的成员分配足够大的空间
  • 给联合体其中一个成员赋值,其他成员的值也会变化
代码一
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;
}

结果:001AF85C
    001AF85C
    001AF85C
代码二
union Un
{
    char c;
    int i;
};
int main()
{
    union Un un = {0};

    un.i = 0x11223344;
    un.c = 0x55;
    printf("%x\n", un.i);
    return 0;
}
结果:11223355

在这里插入图片描述

说明】:
从代码一输出的结果是相同的,说明联合体中成员变量是一块空间存储。从代码二输出中,第四个字节的内容被修改位55,对联合体中成员赋值,会影响联合体的全部成员,char类型只占用一个字节。

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

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

在这里插入图片描述

说明】:结构体是通过以为空间换取时间设计("浪费"空间),而联合体是节省空间


1.4 计算联合体的大小

规则如下】:

  • 联合体的大小至少是最大成员的大小
  • 当最大成员大小(联合体总大小)要对齐到最大对齐数的整数倍
#include <stdio.h>
union Un1
{
    char c[5]; 1 8 1//最大成员大小为5
        int i;  4 8 4
};//最大对齐数位4,最大成员大小为5,对齐到8是最大对齐数的整数倍

union Un2
{
    short c[7]; 2 8 2//最大成员大小为7
        int i;  4 8 4
};//最大对齐数位4,最大成员大小为7,对齐到16是最大对齐数的整数倍

int main()
{
    printf("%d\n", sizeof(union Un1));-->8
    printf("%d\n", sizeof(union Un2));-->16
    return 0;
}

1.5 联合体的实际使用样例

场景如下,搞一个礼品兑换,礼品兑换单中有三种商品:图书、被子、衬衫。每一种商品的信息:库存量、价格等相关的其他信息

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

如果单纯采用结构体,将变量全部写下来:

struct list
{
    int stock_number;//库存量
    double price;//定价
    int item_type;//商品类型

    char title[20];//书名
    char author[20];//作者
    int num_pages;//页数
    char design[30]//设计
        int colors;//颜色
    int sizes;//尺寸   
}

优点】:

  • 设计简单,使用方便

【缺点】:

  • 包含了各种的属性,内存占用比较大、浪费空间也加大了
  • 部分属性信息是常用的,有些商品不需这部分信息

解决办法:】把公共属性单独写出来,剩余属于各种商品本身的属性使用联合体处理,再一定程度上节省了内存

配合上联合体设计:

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 check_sys()
{
    union
    {
		int i;
        char c;
    }
    un.i=1;//00 00 00 01-->01 00 00 00(小端)
    return un.c 
}

二、Enum(枚举)

枚举顾名思义就是⼀>列举

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

2.1 枚举类型的声明

比如列举:星期一到星期日十有限的七天或者性别、颜色等。

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

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

在声明枚举类型的时候,可以同时对枚举常量初始化(枚举常量都是有值的,默认从0开始,并且依次递增)

enum Sex
{
    Man=10;
    Woman;//11
}

2.2 枚举类型的优点

问题】:

这里就像#define定义常量,为什么还有枚举这样子数据类型

枚举的优点】:

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

2.3 枚举类型的使用

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

使用枚举常量给枚举变量赋值,也可以拿整数给枚举变量赋值(C语言可以,C++不行,C++检查比较严格)

使用场景】:

比如:在枚举类型中定义事物的编号,通过输入数字(编号),找到对应的事情

enum color
{
    Red=1;
    Blue;//1递增为2
}
int main()
{	
    enum color favorite_color;
    printf("请输入你喜欢的颜色:(1.Red,2.Bule)");
    //输入1或2去代表Red或Bule
    scanf("%u",&favorite_color);
    switch(favorite_color)
    {
        case Red(Red==1):
            printf("%你喜欢的颜色为红色");
            break;
        case Blue(Blue==2):
            printf("%你喜欢的颜色为蓝色");
            break;
        default :
            printf("没有喜欢的颜色")
    } 
}

【说明】:这里不是输入枚举对象,而是枚举对象对应的数字。


在这里插入图片描述
以上就是本篇文章的所有内容,在此感谢大家的观看!这里是店小二C语言笔记,希望对你在学习C语言中有所帮助!

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

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

相关文章

基于jeecgboot-vue3的Flowable新建流程定义(三)

因为这个项目license问题无法开源&#xff0c;更多技术支持与服务请加入我的知识星球。 接上一节 8、同时可以进行流程的编辑 /** 编辑流程设计弹窗页面 */const handleLoadXml (row) > {console.log("handleLoadXml row",row)designerData.title "流程设…

Unity学习日志

目录 获取相机可视范围的世界坐标(2D) 视口转世界坐标和屏幕转世界坐标的区别: 屏幕转世界坐标 视口转屏幕坐标 视口转屏幕结合3D数学实现可视范围的怪物生成 transform.up游戏对象的方向问题 其实还有一种不用Translate的写法: 修改 transform.up 的行为和影响 C#抽象…

ROM的简单实现

描述 实现一个深度为8&#xff0c;位宽为4bit的ROM&#xff0c;数据初始化为0&#xff0c;2&#xff0c;4&#xff0c;6&#xff0c;8&#xff0c;10&#xff0c;12&#xff0c;14。可以通过输入地址addr&#xff0c;输出相应的数据data。 接口信号图如下&#xff1a; 使用Veri…

MIPS汇编语言详解

MIPS&#xff08;Microprocessor without Interlocked Pipeline Stages&#xff09;是一种精简指令集计算机&#xff08;RISC&#xff09;架构&#xff0c;由MIPS计算机系统&#xff08;现在是MIPS Technologies&#xff09;开发。它以其简单性和效率而闻名&#xff0c;特别适用…

【数据结构】排序算法大全(快速、堆、归并、插入、折半、希尔、冒泡、计数、基数)各算法比较、解析+完整代码

文章目录 八、排序1.插入排序1.1 直接插入排序1.2 折半插入排序1.3 希尔排序 2.交换排序2.1 冒泡排序2.2 快速排序 3.选择排序3.1 简单选择排序3.2 堆3.2.1 堆排序3.2.2 堆插入删除*完善代码 堆 4.归并、基数、计数排序4.1 归并排序4.2 基数排序4.3 计数排序 5.内部排序算法的比…

PCL 二维凸包切片法计算树冠体积

目录 一、算法原理1、原理概述2、参考文献二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、算法原理 1、原理概述 二维凸包法是先将树冠等间隔分层切片,如图(e)采用二维凸包算法对每层…

中国改革报是什么级别的报刊?在哪些领域具有较高的影响力?

中国改革报是什么级别的报刊&#xff1f;在哪些领域具有较高的影响力&#xff1f; 《中国改革报》是国家发展和改革委员会主管的全国性综合类报纸。它在经济领域和改革发展方面具有重要的影响力&#xff0c;是传递国家政策、反映改革动态的重要平台。该报对于推动中国的经济改…

实验室课程|基于SprinBoot+vue的实验室课程管理系统(源码+数据库+文档)

实验室课程管理系统 目录 基于SprinBootvue的实验室课程管理系统 一、前言 二、系统设计 三、系统功能设计 1管理员功能模块 2学生功能模块 3教师功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介…

PyTorch深度学习实战(44)——基于 DETR 的目标检测模型

PyTorch深度学习实战&#xff08;44&#xff09;——基于 DETR 的目标检测模型 0. 前言1. Transformer1.1 Transformer 基础1.2 Transformer 架构 2. DETR2.1 DETR 架构2.2 实现 DETR 模型 3. 基于 DETR 实现目标检测3.1 数据加载与模型构建3.2 模型训练与测试 小结系列链接 0.…

WindowsCMD窗口配置OhMyPosh

WindowsCMD窗口配置OhMyPosh 文章目录 WindowsCMD窗口配置OhMyPosh1. 按装Clink1. 安装Oh-My-Posh2. 安装Clink2. 安装后的位置 2. 编写Lua脚本1. oh-my-posh Lua脚本2. 重启cmd窗口看效果 OhMyPosh对Windows CMD 没有现成的支持。 然而可以使用Clink来做到这一点&#xff0c;它…

深度学习——自己的训练集——训练模型(CNN)

训练模型 1.导入必要的库2.加载类别名称3.创建标签映射字典4.加载图像数据和对应的标签5.构建和编译CNN模型6.训练模型7.保存训练好的模型 1.导入必要的库 导入处理数据和训练模型时需要的库 os: 这个模块提供了与操作系统交互的功能&#xff0c;比如文件和目录操作。 cv2: 这…

2024-5-10-从0到1手写配置中心Config之Spring Value热更新

定义SpringValueProcessor处理类 实现BeanPostProcessor后置处理器接口&#xff0c;扫描所有的Spring value&#xff0c;保存起来。实现ApplicationListener接口&#xff0c;在配置变更时&#xff0c;更新所有的spring value 实现BeanPostProcessor后置处理器接口 实现postPr…

移动云:连接未来的智慧之旅

随着数字化转型的加速&#xff0c;云服务在各行各业中的应用越来越广泛。移动云不仅提供了灵活的计算和存储资源&#xff0c;还通过创新的技术手段&#xff0c;为企业和开发者解决了许多实际问题。在这个变革的大背景下&#xff0c;移动云服务作为中国移动倾力打造的云业务品牌…

155. 最小栈

题目&#xff1a; 设计一个支持 push &#xff0c;pop &#xff0c;top 操作&#xff0c;并能在常数时间内检索到最小元素的栈。 实现 MinStack 类: MinStack() 初始化堆栈对象。void push(int val) 将元素val推入堆栈。void pop() 删除堆栈顶部的元素。int top() 获取堆栈顶…

深入解析内置模块OS:让你的Python代码更懂操作系统

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、OS模块简介与基础应用 二、文件与目录操作详解 三、OS模块的高级应用&#xff1a;双色…

【算法】前缀和——除自身以外数组的乘积

本节博客是用前缀和算法求解“除自身以外数组的乘积”&#xff0c;有需要借鉴即可。 目录 1.题目2.前缀和算法3.变量求解4.总结 1.题目 题目链接&#xff1a;LINK 2.前缀和算法 1.创建两个数组 第一个数组第i位置表示原数组[0,i-1]之积第二个数组第i位置表示原数组[i1,n-1]…

How to limit request by IP on nginx?

/etc/nginx/conf.d/default.conf 1.Define a limit_req_zone # 定義限流區塊 limit_req_zone $binary_remote_addr zonelimit_zone:10m rate2r/s; limit_req_zone $binary_remote_addr zonelimit_zone:10m rate2r/s; 是一个 Nginx 配置指令&#xff0c;用于定义请求限制区域和…

【linux】多线程(2)

文章目录 线程的应用生产消费者模型自制锁生产消费队列成员参数生产函数消费函数 任务处理方式主函数 POSIX信号量sem_wait()sem_post() 线程池应用场景示例 单例模式饿汉实现单例 吃完饭, 立刻洗碗, 这种就是饿汉方式. 因为下一顿吃的时候可以立刻拿着碗就能吃饭.懒汉实现单例…

GMSL2硬件设计V1.1

一、说明 GMSL(Gigabit Multimedia Serial Links),中文名称为千兆多媒体串行链路,是Maxim公司(现属于ADI)推出的一种高速串行接口,通过同轴电缆或屏蔽双绞线(STP)传输高速串行数据,用于汽车摄像头和显示器应用。GMSL2就是指ADI专有的第二代千兆多媒体串行链路技术,传输…

重生之while在鸣潮学习HTML

个人主页&#xff1a;终端 今天是开荒的第五天&#xff0c;数据坞都刷了吗&#xff0c;没刷就过来学html&#xff01; 目录 JavaWeb学习路线 1.HTML入门 1.1什么是HTML 1.2HTML&CSS&JavaScript的作用 1.3什么是超文本 1.4什么是标记语言 1.5HTML基础结构 1.6HTML的…