自定义类型——联合体类型、枚举类型

本篇将讲解联合体和枚举的基本知识,这两个类型相对于结构体要简单一些,只要了解了结构体,它们学起来会非常容易

如果有还不了解结构体的小伙伴可以点击我学习结构体


目录

联合体 

声明: 

联合体的大小:

联合体的特点: 

枚举类型 

枚举类型的作用和优点:

 枚举类型的声明:


联合体 

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

声明: 

 联合体的声明和结构体一样,关键字是 union

struct tag

{

 member-list;

}variable-list;

 member-list 是成员列表,variable-list 是定义联合体同时所创建的这个联合体类型的全局变量

联合体的大小:

 1.联合体的大小至少是最大成员的大小

2.当最大成员大小不是最大对齐数的整数倍时,就要对齐到最大对齐数的整数倍(注意:这个条件在很多地方乃至有些教科书上都是没有写的,都是默认只有上面的第一个条件)

如果不清楚对齐数可以点击我,看“内存对齐”部分

联合体的特点: 

 联合体的成员是共用同一块内存空间的,联合变量的大小至少是最大成员的大小

 下面图文讲解以便理解:

                                                              代码运行验证 :

 

注意: 上图例涉及一点大小端存储模式,可以点击我以了解大小端 

并且,联合体的使用也是和结构体一样,都是用 " . " (点操作符) 和 " -> "(箭头操作符) 来访问成员的,若也有不了解的小伙伴可以点击我,学习“结构访问操作符”内容

注意: 

对于上面图例,这里还可以提一点,有人可能不清楚为什么 变量b 的内存 为什么在低地址那,我这里说一个规律,栈区的内存分配是从高地址往低地址的,比如上面我们创建 union U 类型的变量 n,给它分配了一块地址较高的空间,但是,在这块空间内,我们的多个成员的内存分配还是从低地址往高地址增长的,像其他类型的数据也是这样的(比如数组),我们可以理解为分配整块大空间时是从高地址往低地址分配,而给这块大空间内的小空间分配时还是从低地址往高地址分配的(再再提一嘴,大伙要分清 栈顶 和 栈底 的意思哦,关于这些方面的文章我还没有写,所以大家想了解只能自己去找了)


枚举类型 

枚举类型有点特殊,特殊在它的作用,很多初学者不知道它到达有什么作用,而且也基本使用不到, 所以即便了解了它也会觉得迷迷糊糊、莫名其妙的感觉,不过以后见得多、用的多慢慢就明白了

枚举类型的作用和优点:

因为它那一点点的特殊性,我们这里就先说清楚它是拿来干嘛的,以便后面好理解

 作用:

列举一系列成员,并将它们定义为常量值(这些成员也就是标识符)

优点:

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

2.枚举有类型检查,比 #define 定义的标识符更加严谨(前者有类型,而后者没有)

3.便于调试,预处理阶段会删除 #define 定义的符号(调试时枚举具有可观察性,而 #define 没有)

例:比如定义 GOD 为 1 ,在调试时,#define 定义的符号只能看见所定义的值(也就是只能看见 1),而枚举可以看见 GOD,并显示 GOD 值是 1(自己调试看看就能更加明白了~)

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

5.枚举常量遵行作用域规则的,枚举声明在函数内则只能在函数内使用,而 #difine 定义的是全局的

因为枚举的作用和 #define 差不多,所以这里拿它们俩比较

 枚举类型的声明:

枚举类型声明的格式也和结构体很类似,不过每一个成员是以逗号隔开的,关键字是 enum

例:

enum Sex

{

  MALE,

  FEMALE,

  SECRET

};

注意:最后一个成员不用写逗号

 { } 中的内容是枚举类型的可能取值,也叫枚举常量,这些取值默认从 0 开始,依次递增 1,在声明枚举类型时也可以赋初值

注意:这些枚举常量是常量,是不能被修改的

例: 

#include<stdio.h>
int main()
{
	enum Sex

	{
		男 = 3, 
		女,  
		保密 = 7  
	};
	int people = 0;
	printf("请输入性别:男3,女4,保密5\n");
	scanf("%d", &people);
	
	if (people == 3)
		printf("男性\n");
	//
	if (people == 女)
		printf("女性\n");
	return 0;
}

 大家可以看看区别,people == 3 和 people == 女,当你以后或者别人来看你的代码时,是前面一个更容易理解呢还是后面一个呢,这就是枚举类型的作用及优点所在了

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值