首页 > 其他分享 >第20讲:自定义类型:联合和枚举

第20讲:自定义类型:联合和枚举

时间:2024-05-28 23:34:11浏览次数:31  
标签:20 自定义 int 联合体 char union 枚举 un

目录

1. 联合体

1.1 联合体类型的声明

像结构体⼀样,联合体也是由⼀个或者多个成员构成,这些成员可以是不同的类型。
但是编译器只为最⼤的成员分配⾜够的内存空间。联合体的特点是所有成员共⽤同⼀块内存空间。所以联合体也叫:共⽤体。
给联合体其中⼀个成员赋值,其他成员的值也跟着变化。

#include <stdio.h>
//联合类型的声明
union Un
{
    char c;
    int i;
};
int main()
{
    //联合变量的定义
    union Un un = {0};
    //计算连个变量的⼤⼩
    printf("%d\n", sizeof(un));
    return 0;
}

输出的结果:

4

为什么是4呢?

1.2 联合体的特点

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

//代码1
#include <stdio.h>
//联合类型的声明
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
//代码2
#include <stdio.h>
//联合类型的声明
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

代码1输出的三个地址⼀模⼀样,代码2的输出,我们发现将i的第4个字节的内容修改为55了。我们仔细分析就可以画出,un的内存布局图。
在这里插入图片描述

1.3 相同成员的结构体和联合体对比

我们再对⽐⼀下相同成员的结构体和联合体的内存布局情况。

struct S
{
    char c;
    int i;
};
struct S s = {0};
union Un
{
	char c;
	int i;
};

union Un un = {0};

在这里插入图片描述

1.4 联合体的大小

1.联合的大小至少是最大成员的大小。
2.当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。

#include <stdio.h>
union Un1
{
    char c[5];
    int i;
};
union Un2
{
    short c[7];
    int i;
};
int main()
{
    //下⾯输出的结果是什么?
    printf("%d\n", sizeof(union Un1));
    printf("%d\n", sizeof(union Un2));
    return 0;
}

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

图书:书名、作者、⻚数
杯⼦:设计
衬衫:设计、可选颜⾊、可选尺⼨

那我们不耐心思考,直接写出以下结构:

struct gift_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;//尺⼨
};

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

商品是图书,就不需要design、colors、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;
};

1.5 联合的一个练习

写⼀个程序,判断当前机器是⼤端?还是⼩端?

int check_sys()
{
    union
    {
    	int i;
    	char c;
    }un;
    un.i = 1;
    return un.c;//返回1是⼩端,返回0是⼤端
}

2. 枚举类型

2.1 枚举类型的声明

枚举顾名思义就是⼀⼀列举。把可能的取值⼀⼀列举。⽐如我们现实⽣活中:

⼀周的星期⼀到星期⽇是有限的7天,可以⼀⼀列举。性别有:男、⼥、保密,也可以⼀⼀列举。⽉份有12个⽉,也可以⼀⼀列举。三原⾊,也是可以意义列举
这些数据的表⽰就可以使⽤枚举了。

enum Day//星期
{
	Mon,
	Tues,
	Wed,
	Thur,
	Fri,
	Sat,
	Sun
};
enum Sex//性别
{
	MALE,
	FEMALE,
	SECRET
};
enum Color//颜⾊
{
	RED,
	GREEN,
	BLUE
};

以上定义的 enum Day , enum Sex , enum Color 都是枚举类型。
{}中的内容是枚举类型的可能取值,也叫 枚举常量 。这些可能取值都是有值的,默认从0开始,依次递增1,当然在声明枚举类型的时候也可以赋初值。

enum Color//颜⾊
{
	RED=2,
	GREEN=4,
	BLUE=8
};

2.2 枚举类型的优点
为什么使⽤枚举?
我们可以使⽤ #define 定义常量,为什么⾮要使⽤枚举?
枚举的优点:

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

2.3 枚举类型的使用

enum Color//颜⾊
{
	RED=1,
	GREEN=2,
	BLUE=4
};
enum Color clr = GREEN;//使⽤枚举常量给枚举变量赋值

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

完。

标签:20,自定义,int,联合体,char,union,枚举,un
From: https://blog.csdn.net/m0_46676283/article/details/139196845

相关文章

  • [自动驾驶技术]-8 Tesla自动驾驶方案之硬件(AI Day 2022)
    特斯拉在AIDay2022先介绍了AI编译器,后面又介绍了Dojo的硬件软件,软件部分和AI编译器有部分重叠,本文介绍还是延用AIDay的思路,分为三部分:AI编译和推理,Dojo硬件,Dojo软件。特斯拉车道检测网络特斯拉车道网络使用稀疏点预测和计算来识别和预测车道线的位置和形状,极大地减少......
  • 2024铁三决赛专项题-zip_guessinteger
    2024铁三决赛专项题-zip_guessinteger简介:ZIP包竟然加密了,快上我的暴力破解工具。难道我需要一个量子算力吗?能否使点巧力猜猜?需要使用的工具:bkcrack工具地址:https://github.com/kimci86/bkcrack题目附件上玄机自取:https://xj.edisec.net1.第一层​echo-n'breakthr......
  • Apache Log4j2-RCE-CVE-2021-44228
    ApacheLog4j2-RCE-CVE-2021-44228基本信息CVE编号:CVE-2021-44228CVSS:CVSS2.0/AV:N/AC:M/Au:N/C:C/I:C/A:C漏洞类型:远程命令执行影响产品:Apache影响版本:ApacheLog4j2.x<=2.14.1<=Log4j2.15.0-rc1漏洞描述​log4j支持JNDI协议。​ApacheLog4j通过定义每一条......
  • 在Spring中自定义事件及发布与监听
    在Spring框架中,自定义事件及其发布与监听是一个涉及Spring事件机制的过程。Spring提供了一个基于观察者模式的事件发布和监听机制,允许在Spring容器中的组件之间进行松耦合的通信。以下是如何自定义事件以及如何发布和监听这些事件的步骤:1.创建自定义事件类首先,需要定义一......
  • 【软件插件】VRay6.2渲染器安装教程(支持SketchUp草图大师2019-2024版本)
    下载链接:https://docs.qq.com/doc/DREh5ak5aQWJTdWdU详细图文教程:https://www.yuque.com/zhefengerhuanzaigua/bld6x5/cul5nfqrf7rw40lv软件介绍VRay是业界最受欢迎的渲染引擎。基于V-Ray内核开发的有VRayfor3dsmax、Maya、Sketchup、Rhino、CINEMA4D等诸多版本,为不同领......
  • CCF-CSP真题《202403-1 词频统计》思路+python满分题解
    哇q(≧▽≦q),第一次写博客,请大家多多关照○| ̄|_ 看到没啥人提供202403的第一题解题思路及python代码,刚好写完,心血来潮想分享解题思路,就写下了这篇博客,有其他的编码版本,欢迎大家一起探讨呀(虽然我是算法菜鸟┗(T﹏T)┛,但有问题,我会尽力回答的!!!)好了废话不多说,上解题思路!大概想了......
  • 2036:【例5.3】开关门
    2036:【例5.3】开关门时间限制:1000ms      内存限制:65536KB提交数:60201   通过数: 38835【题目描述】宾馆里有n(2≤n≤1000)n(2≤n≤1000)个房间,从1∼n1∼n编了号。第一个服务员把所有的房间门都打开了,第二个服务员把所有编号是22的倍数的房间“相......
  • [JSOI2011] 分特产
    [SDOI2017]序列计数题目信息题目链接LGP3702、LOJ2002题目描述Alice想要得到一个长度为\(n\)的序列,序列中的数都是不超过\(m\)的正整数,而且这\(n\)个数的和是\(p\)的倍数。Alice还希望,这\(n\)个数中,至少有一个数是质数。Alice想知道,有多少个序列满足她的要求......
  • ICPC2024昆明邀请赛 J The Quest for El Dorado 题解
    QuestionTheQuestforElDorado有一个王国,有\(n\)个城市和\(m\)条双向铁路连接这些城市。第\(i\)条铁路由第\(c_i\)家铁路公司运营,铁路的长度为\(l_i\)。你想要环游这个国家,从城市\(1\)出发。为了你的旅行,你购买了\(k\)张火车票。第\(i\)张火车票用两个整数\(......
  • Guitar Pro2025功能丰富的专业吉他和弦、乐谱以及录音制作软件
    作为一名热衷于音乐制作的爱好者,我深知创作的乐趣与挑战。在音乐创作的旅程中,有一款工具可以极大地提升我们的创作效率和质量——GuitarPro8,这是一款功能丰富的专业吉他和弦、乐谱以及录音制作软件。它不仅深受广大音乐创作者的喜爱,更是现代音乐创作的得力助手。今天,我要和大......