【C语言】自定义类型的详细讲解2(枚举类型、联合体类型)

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

目录

1.枚举

1.1枚举优点

2.联合(共用体)

2.1联合体的应用

2.2联合体的存放


上一篇文章与大家分享并深度讨论研究了自定义类型中结构体和位段的内容,那么今天继续研究枚举和联合体的内容,希望对你有所帮助

1.枚举

枚举类型顾名思义就是一一列举。

把可能的取值一一列举出来。

一周的星期一到星期日是七天时间;

一年有十二个月份;

男女的性别也可以列举出来;

等等等等其他有很多可以被列举出来

枚举类型的关键字是enum,

enum SEX
{

};

和结构体相似,有枚举类型的关键字,有枚举标签,在大括号中放的是枚举未来的可能取值

那在这里我们枚举性别来了解一下

enum SEX
{
	//枚举的可能取值
	MALE,
	FEMALE,
	SECRET,
};

这样我们就创建好了一个枚举类型;

我们也可以用这个枚举类型在main函数中创建出一个枚举变量,完整的情况如下

#include<stdio.h>
enum SEX
{
	//枚举的可能取值
	MALE,
	FEMALE,
	SECRET,
};
int main()
{
	enum SEX s = MALE;
	return 0;
} 

只能把枚举值赋予枚举变量,不能把元素的数值直接赋予枚举变量。

那我们更加直观的来了解一下这些枚举的取值到底是什么,为什么可以被直接赋值呢?

我们直接将他们打印出来

【C语言】自定义类型的详细讲解2(枚举类型、联合体类型)

 可以看到他们的可能取值默认值是0 1 2

所以,枚举的可能取值,默认是从0开始,1递增;

我们也可以给它设置一个初始值,让他从你想要的值开始加1递增

【C语言】自定义类型的详细讲解2(枚举类型、联合体类型)

 可以看到我们给MALE后面的值就会从5开始往后递增1;

那如果不给MALE赋值,而是给FEMALE赋值呢?

【C语言】自定义类型的详细讲解2(枚举类型、联合体类型)

那么 就会从被赋值的枚举常量开始赋值,还是0默认为初始值。

既然枚举是默认从零开始,那在main函数中的枚举变量是否可以直接数字初始化呢?

【C语言】自定义类型的详细讲解2(枚举类型、联合体类型)

 这里要注意的是我们,这样的写法在C语言是可以的,因为我们写C语言时创建的都是.C的文件

【C语言】自定义类型的详细讲解2(枚举类型、联合体类型)

 但是一旦到了C++的开发环境下,这样的写法就会出现错误【C语言】自定义类型的详细讲解2(枚举类型、联合体类型)

 所以严谨一点,在给枚举变量赋值或者初始化时都要使用枚举常量。

1.1枚举优点

那枚举类型的好处是什么呢?

大家以前可能接触过一些c语言的小游戏,在开始的菜单时会提供选项和对应的内容供玩家选择

【C语言】自定义类型的详细讲解2(枚举类型、联合体类型)

 输入1就对应着游戏开始,数字0就对应着退出游戏,但是我们看到这样的代码时用数字和操作对应起来会有点别扭的感觉,我们不妨用枚举来提高代码的可读性;

【C语言】自定义类型的详细讲解2(枚举类型、联合体类型)

这样看到EXIT就是0;PLAY就是1;代码的可读性和可维护性提高了,也更加严谨。

我们同样可以使用#define对EXIT和PLAY

【C语言】自定义类型的详细讲解2(枚举类型、联合体类型)

那这样与枚举类型有什么区别呢? 

 注意:#define的宏定义是没有规定类型的,而枚举是自带类型检查的,是枚举类型,并且用枚举的方式也便于我们调试,调试如下

【C语言】自定义类型的详细讲解2(枚举类型、联合体类型)

 并且相对于#define的宏定义也相对方便,不用一个一个的#define宏定义。

2.联合(共用体)

联合体又叫共用体,也是一种特殊的自定义类型

同样的联合体也有自己的关键词:union

和我们之前分享的struct、enum类似的关键字,都可以定义自定义类型

这种类型的变量同样也包含一系列成员,特征是这些成员公用同一块空间,所以联合体也叫共用体;具体是什么意思呢?我们从他们的空间大小来入手

上代码

#include<stdio.h>
union Un
{
	char c;
	int i;
};
int main()
{
	union Un u;
	printf("%d\n", sizeof(u));
	return 0;
}

和其他自定义类型相似的,有关键词有标签名,我们在成员中定义了两个变量;

char c占一个字节;

int i占四个字节

我们在main函数中输出他们的大小,可以预测一下它的大小;

【C语言】自定义类型的详细讲解2(枚举类型、联合体类型)

 可以看到输出的联合体大小是4,是否和你预想的一样呢?

这时候问题来了,四个字节加上一个字节不是五个字节的大小吗?

我们不妨将他们的地址打印出来,通过地址来了解他们

【C语言】自定义类型的详细讲解2(枚举类型、联合体类型)

这下通过访问地址就一目了然

【C语言】自定义类型的详细讲解2(枚举类型、联合体类型)

 通过图例的意思就是这四个字节的空间是变量u的,变量u中,i也同样占了四个空间,而i的首地址与u的首地址相同,在一个位置上;同样的c只占了一个字节的空间,起始地址和u和i也同样在一起,这样我们就验证了共用体其实联合使用了一块空间。

这样在我们使用联合体的时候我们就会发现,我们只能同时使用联合体中的一个变量,因为他们所使用的是同一块空间,改变其中一个数据,另一个可能也会随之而改变。

2.1联合体的应用

既然只能同时使用一个联合体成员变量,我们不妨用大小端储存来举例子

大小端储存简单复习就是高低位字节数据的存放位置,小端储存方式就是将低位字节数据放到低地址,将高位字节数据放到高地址;大端储存方式相反,就是将地位字节数据放到高地址,将高位字节数据放到低地址;

之前的一种方法如下

【C语言】自定义类型的详细讲解2(枚举类型、联合体类型)

 1的二进制序列就是00 00 00 01,很显然1位于低位字节处,放在了低地址处,我们定义一个char类型的指针(访问一个字节),如果第一次访问的到并将其解应用等于1的话,那就是小端储存(低位字节数据放在低地址)。

那接下来使用联合体来判断大小端储存方式;

union Un
{
	char c;
	int i;
};
int main()
{
	union Un u;
	u.i = 1;
	if (u.c == 1)
        printf("小端\n");
	else
		printf("大端\n");
	return 0;
}

配合图示一齐讲解这串代码

【C语言】自定义类型的详细讲解2(枚举类型、联合体类型)

 我们可以看到联合体变量中 i 所占空间最大,所以 u 就申请到了4个空间,同样的 i 也占了四个空间;

我们给这个空间存放int类型的数字1,占四个字节的空间,接下来我们用c来判断,因为 c 只占用一个字节,并且起始地址和i相同,如果这个 c 解应用等于1,那就是小端储存;

如果i中储存1的方式是00 00 00 01,这时 c 解应用为0,那么这就是大端储存方式;

代码运行起来看一下啊

【C语言】自定义类型的详细讲解2(枚举类型、联合体类型)

这就说明联合体的成员使用或者访问的就是同一块空间

还要注意的是联合体的大小至少是其中最大成员的大小,因为联合体变量申请的空间最小也要满足成员变量的空间。

2.2联合体的存放

用代码来引出联合体存放的问题

union Un
{
	char arr[5];//占用5个字节
	int n;//占用4个字节
};
int main()
{
	printf("%d", sizeof(union Un));
	return 0;

}

我们可以预测一下输出的结果

【C语言】自定义类型的详细讲解2(枚举类型、联合体类型)

 结果是否和你想的一样呢?

这样的结果反馈出了联合体的内存也需要对齐

其实也不难理解

char arr[5]是连续存放的,我们也可以将其理解为5个char类型的变量,然后根据上一章的内容找对齐数。char类型的对齐数是1,int类型的对齐数是4,默认对齐数必须是最大对齐数的整数倍,所以5个char类型的数据占据5个字节的空间(从零开始到四占了五个),四是int的倍数,刚好可以存放剩下int类型的字节空间,总共占据了8个空间。

所以在这里要更强调的一点是联合体的大小,至少是成员里最大成员的大小。

​​​​​以上就是本次要分享的自定义类型讲解的内容,希望对你有所帮助。文章来源地址https://www.toymoban.com/news/detail-416883.html

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

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

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

相关文章

  • 自定义类型——枚举与联合体

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

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

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

    2024年02月16日
    浏览(29)
  • 详解自定义类型:枚举与联合体!

    目录  ​编辑 一、枚举类型 1.枚举类型的声明 2.枚举类型的优点 3.枚举类型的使用 二、联合体类型(共用体) 1.联合体类型的声明 2.联合体的特点 3.相同成员的结构体和联合体的对比 4.联合体大小的计算 5.用联合体判断大小端   三.完结散花                            

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

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

    2024年02月20日
    浏览(36)
  • C/C++之自定义类型(结构体,位段,联合体,枚举)详解

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

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

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

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

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

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

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

    2024年01月21日
    浏览(57)
  • C语言枚举与联合体详解

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

    2024年02月15日
    浏览(31)
  • 【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日
    浏览(28)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包