自定义类型(枚举、联合)详解

本文介绍了枚举和联合体的概念及其在编程中的应用。枚举用于列举可能的取值,如星期、性别等,提供代码可读性和类型检查。在未指定值的情况下,枚举常量默认从0开始递增。联合体则是一种特殊类型,其所有成员共享同一内存空间,大小由最大成员决定。通过联合体可以判断计算机的大小端存储模式。此外,文章还讨论了联合体的空间大小计算和内存对齐原则。
摘要由CSDN通过智能技术生成

枚举

什么是枚举?
枚举就是将一些可能的取值一一列举出来。
例如我们现实生活中的:
星期一至星期天、性别,月份,颜色等都可以一一的列举出来。此时就可以使用枚举了

枚举类型的定义

枚举的关键字为enum,枚举的英文为enumeration.

//枚举举例
enum Color
{
	red,
	yellow,
	blue,
	green //最后一个不要要逗号
}; //别忘记分号

//sex
enum Sex
{
	male,
	female,
	secret
};
//星期
enum Day
{
	Monday,
	Tuesday,
	Wedsday,
	Thurday,
	Friday,
	Satday,
	Sunday
};

上面例子中的enum Color, enum Day, enum Sex都是枚举类型。花括号{}中的内容就是所在枚举内所有可能取值,叫做枚举常量。
它叫做枚举常量,但是常量我们是可以知道它的值的,枚举常量的值是多少呢?我们将使用其中一个例子来看看
在这里插入图片描述
显示出来的结果是0、1、2、3.
其实对于枚举常量来说,在我们没有给它赋值的情况下,第一个值默认为0,剩下的值依次递增1。如果赋值给其中一个量那么就会按照赋值的那个数开始,往后的值依次递增1.虽然枚举常量是常量,但是我们可以在声明的时候对它进行赋值。
我们使用刚才的例子将第一个常量赋值为2:
在这里插入图片描述
又如我们将其中一个量赋值为7:
在这里插入图片描述

枚举的优点

我们在平常可以使用宏来定义常量,但是为什么会有使用枚举的情况呢?
枚举有几大优点:

  • 增加了代码的可读性和可维护性
  • 枚举有类型的检查,比较严谨
  • 防止了命名污染
  • 比较方便,一次可以定义很多个常量

联合

联合又称为共用体。它是一种比较特殊的自定义类型,它的所有成员公用同一块空间,所以它叫做(联合)共用体。
联合是什么样子的呢?联合的关键字:union

//联合的声明
union Un
{
	int a;
	char b;
}; //分号不要忘记

联合的成员是共同用一块内存空间的。那么联合所占的内存空间最起码要容纳得下最大得那个成员。这也是联合最重要的一个特点。
在这里插入图片描述

在这里插入图片描述

在之前的文章中,我有谈论过大小端存储模式。
来回顾一下什么是大小端存储模式?

大端(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中;

小端(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位,,保存在内存的高地址中。

使用联合也可以计算出所使用的计算机采用的是哪一种存储模式

//大端存储还是小端存储
# include <stdio.h>
union Un
{
	int a;
	char b;
 };
//创建变量
union Un i ;

int main(void)
{
	i.a = 1;
	if (i.b == 1)
	{
		printf("是小端存储\n");
	}
	else
	{
		printf("是大端存储\n");
	}
	return 0;
}

联合空间大小的计算

在计算结构体的大小时,涉及到了结构体的内存对齐。那么联合的大小是否存在内存对齐呢?
首先需要了解两个点

  • 联合的大小最起码能存放得下最大的那个成员。
  • 联合的最大成员大小不是对齐数的整数倍的时候需要对齐到最大对齐数的整数倍。
//例一
union Un1
{
	char c[5];
	int i;
};
//例二
union Un2
{
	short c[7];
	int i;
};

你能猜出例一和例二中联合的大小吗?
在这里插入图片描述

在这里插入图片描述

以上就是本文要讲解的内容。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小酥诶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值