详解自定义类型:枚举与联合体!

这篇具有很好参考价值的文章主要介绍了详解自定义类型:枚举与联合体!。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

 ​编辑

一、枚举类型

1.枚举类型的声明

2.枚举类型的优点

3.枚举类型的使用

二、联合体类型(共用体)

1.联合体类型的声明

2.联合体的特点

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

4.联合体大小的计算

5.用联合体判断大小端

  三.完结散花


 

                                            悟已往之不谏,知来者犹可追                                                        

创作不易,宝子们!如果这篇文章对你们有帮助的话,别忘了给个免费的赞哟~ 

一、枚举类型

1.枚举类型的声明

枚举顾名思义就是一一列举~

比如在我们现实生活中:

一个星期有七天可以一一列举~

一个人的性别有男、女、保密三种可以一一列举~

月份有12个月可以一一列举~

所以这些数据我们就可以用枚举来表示了~

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

注意:上面的enum Day、enum Sex、enum Color都是我们自定义的枚举类型,其中枚举类型的关键字是enum,而{}中的内容是枚举类型的可能取值,也叫枚举常量

而且这些枚举常量都是有值的,默认从0开始,然后依次递增1,当然  我们在声明枚举类型的时候也可以赋初值~

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

2.枚举类型的优点

我们可以用#define来定义常量,为什么非要用枚举?

1.增加代码的可读性和可维护性

2.和#define定义的标识符比较,枚举具有类型检查,更加严谨

3.便于调试,预处理阶段会删除#define定义的符号

4.方便使用,一次可以定义多个常量

5.枚举常量是遵循作用域规则的,在函数内部定义的枚举常量只能在函数内部使用

3.枚举类型的使用

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

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

详解自定义类型:枚举与联合体!,C语言,算法,数据结构

二、联合体类型(共用体)

1.联合体类型的声明

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

2.联合体的特点

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

 详解自定义类型:枚举与联合体!,C语言,算法,数据结构

为什么是4呢?

联合的成员是共用同⼀块内存空间的,这样⼀个联合变量的大小,至少是最大成员的大小(因为联合至少得有能力保存最大的那个成员)

//代码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;
}
//代码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;
}

 代码一的结果如下~

详解自定义类型:枚举与联合体!,C语言,算法,数据结构

代码二的结果如下~

详解自定义类型:枚举与联合体!,C语言,算法,数据结构

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

详解自定义类型:枚举与联合体!,C语言,算法,数据结构
     

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

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

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

 详解自定义类型:枚举与联合体!,C语言,算法,数据结构

4.联合体大小的计算

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

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

详解自定义类型:枚举与联合体!,C语言,算法,数据结构

5.用联合体判断大小端

详解自定义类型:枚举与联合体!,C语言,算法,数据结构

#include <stdio.h>
int check_cyc()
{
	union
	{
		int i;
		char c;
	}un;
	un.i = 1;
	return un.c;
}
int main()
{
	int ret = check_cyc();
	if (ret == 1)
		printf("小端存储\n");
	else
		printf("大端存储\n");
	return 0;
}

VS2022上的结果~ 

详解自定义类型:枚举与联合体!,C语言,算法,数据结构

6.联合体的使用用例

使用联合体是可以节省空间的,举例:
比如,我们要搞⼀个活动,要上线⼀个礼品兑换单,礼品兑换单中有三种商品:图书、杯子、衬衫。
每⼀种商品都有:库存量、价格、商品类型和商品类型相关的其他信息。
图书:书名、作者、页数
杯子:设计
衬衫:设计、可选颜色、可选尺寸
那我们不耐心思考,直接写出⼀下结构:

struct gift_list
{
//公共属性
int stock_number;//库存量
double price; //定价
int item_type;//商品类型
//特殊属性
char title[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;
};

详解自定义类型:枚举与联合体!,C语言,算法,数据结构

  三.完结散花

好了,这期的分享到这里就结束了~

如果这篇博客对你有帮助的话,可以用你们的小手指点一个免费的赞并收藏起来哟~

如果期待博主下期内容的话,可以点点关注,避免找不到我了呢~

我们下期不见不散~~

详解自定义类型:枚举与联合体!,C语言,算法,数据结构详解自定义类型:枚举与联合体!,C语言,算法,数据结构文章来源地址https://www.toymoban.com/news/detail-825660.html

到了这里,关于详解自定义类型:枚举与联合体!的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C/C++之自定义类型(结构体,位段,联合体,枚举)详解

    专栏分类:C语言初阶      C语言程序设计————KTV       C语言小游戏     C语言进阶 C语言刷题 欢迎大家点赞,评论,收藏。 一起努力,一起奔赴大厂。 目录 个人主页:点我进入主页   1.前言 2.结构体 2.1结构体声明 2.2结构体初始化 2.3结构体的自引用 2,4结构体的内存

    2024年02月08日
    浏览(40)
  • 一篇博客学会系列(2)—— C语言中的自定义类型 :结构体、位段、枚举、联合体

    目录  前言 1、结构体 1.1、结构体类型的声明 1.2、特殊的结构体类型声明 1.3、结构体的自引用 1.4、结构体的定义和初始化 1.5、结构体成员变量的调用 1.6、结构体内存对齐  1.6.1、offsetof 1.6.2、结构体大小的计算 1.6.3、为什么存在内存对齐?  1.7、 修改默认对齐数 1.8、结构

    2024年02月08日
    浏览(42)
  • 自定义类型——枚举与联合体

    枚举顾名思义就是一一列举 把可能的取值一一列举 以上定义的 enum Day , enum Sex 都是枚举类型  { }中的内容是枚举类型的可能取值,也叫 枚举常量 这些可能取值都是有值的,默认从0开始,一次递增1 当然在定义的时候也可以赋初值 例如: 我们可以使用 #define 定义常量,为

    2023年04月19日
    浏览(38)
  • 自定义类型:结构体、枚举、联合体

    结构体是一种自定义的数据类型,它由多个不同类型的成员变量组成,结构体可以将多个相关的数据打包在一起,方便进行管理和处理。 定义形式: struct 结构体名{ 类型 成员名1; 类型 成员名2; //更多的成员变量 }; 如描述一个学生: struct Stu这样就和int类型一样,都是数

    2024年02月16日
    浏览(42)
  • 自定义类型之枚举类型(enum)和联合体类型(union)

    目录   枚举类型(enum) 什么是枚举类型? 枚举类型的使用 枚举类型的优势 枚举类型的应用场景 总结 联合体类型(union) 什么是联合体? 联合体的应用场景 联合体的注意事项 总结 枚举类型是C语言中一种非常有用的数据类型,它允许程序员定义一组命名的常量。枚举类型

    2024年02月20日
    浏览(45)
  • C语言枚举与联合体详解

        本篇文章带来 枚举与联合体 相关知识详细讲解! 如果您觉得文章不错,期待你的一键三连哦,你的鼓励是我创作的动力之源,让我们一起加油,一起奔跑,让我们顶峰相见!!! 目录 一.枚举 1.什么是枚举? 2.枚举类型的定义 3.枚举的优点 4.枚举的使用 二.联合体(共

    2024年02月15日
    浏览(43)
  • 【C语言】位段,枚举和联合体详解

      目录 1.位段 1.1 什么是位段 1.2 位段的内存分配 1.3 位段的跨平台问题 2.枚举 2.1 枚举类型的定义 2.2 枚举的优点 3. 联合(共用体) 3.1 联合类型的定义 3.2 联合的特点 3.3 联合大小的计算 位段的声明和结构体是类似的,有两个不同: 1.位段的成员必须是 int、unsigned int 或 sig

    2024年02月11日
    浏览(38)
  • 【C语言】联合体和枚举

    前言 这篇博客就把剩下的两个自定义类型联合体和枚举好好总结一下,让我们好好看看联合体和枚举到底是什么 个人主页:小张同学zkf 若有问题 评论区见 感兴趣就关注一下吧 目录  1. 联合体 1.1 联合体类型的声明  1.2 联合体的特点  1.3 相同成员的结构体和联合体对比  

    2024年04月14日
    浏览(40)
  • c语言-联合体和枚举

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

    2024年02月04日
    浏览(44)
  • c语言-枚举和联合体

    本篇文章介绍c语言中的枚举类型和联合体类型 枚举类型和结构体类型相似,都是一种自定义类型。 定义枚举类型的: enum 枚举类型的定义格式 例如,定义一个星期作为枚举类型 枚举类型的第一个成员的取值默认为0,依次往后递增1, 输出枚举WEEK每个成员的值 修改枚

    2024年01月21日
    浏览(68)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包