自定义类型:结构体,枚举,联合(3)

TIPS

1. c565e1f079d4412e8b4acadffb521fc4.png

2. 

696d613bdc904a7d9428a732f4ed89db.png

枚举

1. 枚举顾名思义就是一一列举可能的取值,比如一周的星期一到星球天是有限的七天,可以一一列举。有比如性别,月份。
2. 像这种容易并且可以被一一列举的数据我们就可以定义为枚举类型。 

枚举类型 

1. 枚举的关键字为enum 

2. 枚举类型是一种自定义类型,说白了也就是一种数据类型,枚举类型是一种类型,是你自己创造出来的一种类型。

enum Day
{
	Mon,
	Tue,
	Wed,
	Thus,
	Fri,
	Sat,
	Sun
};
enum Sex
{
	male,
	female,
	secret
};
enum color
{
	Red,
	Blue,
	Yellow,
	Green,
	White
};

3, 注意: enum Day, enum Sex, enum color 这些就是枚举类型的名字,是数据类型。就好比int, float, double, struct Peo,......与这些地位一样。

4. {}里面的不是结构体成员,也不是什么枚举的成员......而是该枚举类型的可能取值,也称为枚举常量

枚举常量 = 枚举类型的可能取值   (背负着特殊意义的数字)

1. {}里面的都是枚举类型的可能取值,这些值都是一些不可被改变的量,所以叫常量;又是因为是枚举类型的可能取值,又叫做枚举常量

2. 如 Mon ,Tue, male, Red, Blue......这些都是枚举常量

3.  也正是因为枚举常量本质上就是一个常量,所以可以再代码语句中直接这么单独使用,比如说我打印一下

069281fdd573486e8e895e98b8cdae1e.png

4.  在定义枚举类型的时候可以自己对枚举常量给一个初始值,一旦给了之后由于其是常量,不能修改了的
4. 这些枚举常量都是有值的,默认从0开始一次递增1。当然,在定义枚举类型的时候也可以赋初值,以后如果不再次赋值的话都是递增1

63c1fe0ddb784ae4bf6d6f67332b8de8.png

252a7c2eee4440d9a64a1b63be3dfe64.png

c6dff515aa27400f96d0450838dd2f6d.png

枚举(类型的)变量     (背负着特殊意义的数字)

1. 有了类型名称之后,就也可以去通过枚举类型去定义枚举变量了。  

2.  枚举类型的变量创建好之后,可以对其进行赋值,等号右边就是枚举常量

enum Sex
{
	male,
	female,
	secret
};
int main()
{
	enum Sex a = male;
	enum Sex b = female;
	enum Sex c = secret;
}

 如: a, b, c 都是枚举变量

3. 枚举类型的变量在赋值的时候不能  enum Sex a = 0  (虽然本质上male就是常量0)。这样子因为左边类型是枚举类型,右边是整型,不匹配。 

4. 只能用枚举常量枚举变量等号右边赋值,因为这样子等号两边不会产生类型差异与冲突  

a16e228ecac04534abc85ffb865d2bce.png

枚举的好处 

1.  创建枚举类型与枚举常量,将数字与意义一一对应,使得代码可读性更高。

2.  和#define定义的标识符比较枚举有类型检查,更加严谨。
3.  防止了命名污染(封装)
4.  便于调试
5.  使用方便,一次可以定义多个常量 

补充: (关于#define 定义常量)

1. #define 定义常量的工作原理其实就是在代码里面去无脑替换 

2. 没有类型检查,对于#define定义的东西不能够调试,就是在代码里面无脑替换 

3. 真正运行起来的代码与你肉眼看到的代码是由区别的(直接将#define 定义的常量直接替换掉就是了) 

4.  为什么对于#define定义的东西不能够调试因为调试的时候这些东西老早就不存在了,都被替换掉了, 如 #define MAX 10  ,这个MAX早就在代码里面被10 替代掉了,去世了

关于枚举的注意点1 (关于类型的问题)

5324d616dca84a00baf27047b8cc31a6.png

fc8a160fabcf41e8b6b45c70c158bc20.png

26265a6d5cdc43f39df8089c5346a840.png

所以枚举常量的类型枚举类型枚举变量的类型也是枚举类型 

枚举类型是一种自定义类型,也是数据类型的一员 

关于枚举的注意点2 (关于大小的问题)

000e9550efc6427ca079a35f48f14291.png

枚举变量的大小=枚举常量的大小=枚举类型的大小=一个整型=4个字节 

 (枚举变量里面放着枚举常量)  (枚举常量的类型就是枚举类型


联合体(共用体) 

联合体的创建与联合体成员的访问与联合体变量的创建与初始化都是与结构体高度雷同 

联合体成员也是"五脏俱全" 的

1. 联合体的关键字是union  

2. 联合也是一种特殊的自定义类型。
3. 这种自定义类型里面也包含一系列的联合体成员,特征是这些联合体成员公用同一块空间。所以联合也叫共用体
4. 虽然联合体里面的各成员是在共用着同一块空间的,但是比如说c在用的时候其他的成员不能用,i在用的时候其他的成员也不能用。它们之间不可能同时使用
5. 与我们之前学的结构体不同,它的话每个成员都有自己的独立空间,互不干涉,这儿大家共用同一块空间,很是奇葩。

6. 可以把结构体想象成90年代的苏联,把联合体想象成1917年的苏俄

联合体的大小计算 (也存在一定程度的对齐)

1. 找出最大成员的大小所有成员的最大对齐数 

2. 成员为数组的话,该成员的大小就是数组每个元素大小之和,如成员int arr[10]; 那么这个arr成员的大小就是40字节。
3. 对于数组成员算对齐数的话之前有讲过
4. 联合体大小至少为最大成员的大小最大成员的大小不是所有成员最大对齐数的整数倍的时候,就要对齐到(所占字节个数为)最大对齐数的整数倍处 

5. 一个联合体变量的大小,就不是把大家加起来那么简单(因为有共用现象的存在),而是至少是最大成员的大小,因为联合体至少得有能力保存最大的那个成员。 

b539615e5bb84fc1ad37e45ee33ae8fb.png

联合体在内存中的存放 

1. 联合体其实也没有什么高级的,从内存底层视角去看待

2.  4d531880f5d748cf8efb9cd164dd50b1.png

a4eb97071c2e462f94d07f92c4678823.png

3.  22614c4856a14afb83e3408cf4c2e92c.jpeg

4. 共用同一块内存空间也意味着如果这次我成员a操作改变了里面的数据,会对我以后其他成员产生永久性的影响 

联合体应用(判断大小端字节序存储) 

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

附:7458879b6e8a451db31e0a6f0da81c24.jpeg

abca3867acdc42bd9a2fc7f02f99a283.png

大小端的影响

ffc214ad9efa4f36b3756b2c4f0d3e44.png

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

絕知此事要躬行

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

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

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

打赏作者

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

抵扣说明:

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

余额充值