【自定义类型:联合和枚举】——详解通透!

大家好!今天给大家带来的是C语言中自定义类型:联合和枚举的一些内容,超级适合编程小白学习和复习哦。话不多说,直接上代码,一起来看看吧!!!


1.联合体

1.1与结构体的类比

  1. 结构体struct:多个成员,每个成员都有自己独立的内存空间
  2. 联合体union:多个成员,共用同一块内存空间
  3. 所以,联合体也叫:共用体

1.2联合体类型的声明

//联合体类型的声明
union stu
{
	char c;//1
	int i;//4
};
int main()
{
	union stu u = { 0 };//联合变量的定义及初始化
	//计算变量的大小
	printf("%d\n", sizeof(u));//4
	printf("%p\n", &u);//012FFCE8
	printf("%p\n", &(u.c));//012FFCE8
	printf("%p\n", &(u.i));//012FFCE8
	return 0;
}

注:给联合体其中⼀个成员赋值,其他成员的值也跟着变化。


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

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

在这里插入图片描述


1.4联合体大小的计算

  • 联合体的大小至少是最大成员的大小
  • 当最大成员的大小不是最大对齐数的整数倍时,要对齐到最大对齐数的整数倍
#include <stdio.h>
union Un1
{
char c[5];//1 8 1    大小:5->8
int i;//4 8 4    故最大对齐数是4
};
union Un2
{
short c[7];//2 8 2   大小:14->16
int i;//4 8 4    故最大对齐数是4
};
int main()
{
//下⾯输出的结果是什么?
printf("%d\n", sizeof(union Un1));//8
printf("%d\n", sizeof(union Un2));//16
return 0;
}

1.5联合的一个练习:判断大小端?

以前的写法:

int check_say()
{
	int n = 1;
	return *(char*)&n;//返回第一个字节存放的数
}
int main()
{
	int ret = check_say();
	if (ret == 1)
	{
		printf("小端存储\n");
	}
	else
		printf("大端存储\n");
	return 0;
}

用联合优化后的写法:

int check_say()
{
	union
	{
		char c;
		int i;//联合中,i和c放在同一块内存空间中
	}u;
	u.i = 1;//两个成员共用一块空间
	return u.c;//从一块空间中拿出一部分空间
}
int main()
{
	int ret = check_say();
	if (ret == 1)
	{
		printf("小端存储\n");
	}
	else
		printf("大端存储\n");
	return 0;
}


2.枚举

2.1枚举类型

枚举enum: 把可能的值一一列举出来

enum Day//星期
{//这里是把一个星期的所有可能列举出来
Mon,
Tues,
Wed,
Thur,
Fri,
Sat,
Sun
};
enum Color//颜⾊
{
RED,
GREEN,
BLUE
};

说明:

enum Color//颜⾊
{
RED=5,//5
GREEN,//6
BLUE//7
};
int main()
{
 //取值默认从0开始,若给第一个赋值为a,则从a开始依次递增
	printf("%d\n", RED);a
	printf("%d\n", GREEN);a+1
	printf("%d\n", BLUE);a+2
	return 0;
}

  1. {}内容是枚举类型的可能取值,也叫枚举常量
  2. 默认从0开始,依次递增:0,1,2…
  3. 也可以赋初值,若给第一个常量赋初值为a,则从a开始,依次递增:a,a+1,a+2…

2.2枚举的优点

我们知道,#define也可以定义常量,为何还要用枚举来定义常量呢?

枚举的优点:

  1. 增加代码的可读性和可维护性
  2. 和#define定义的标识符⽐较枚举有类型检查,更加严谨。
  3. 便于调试,预处理阶段会删除 #define 定义的符号
  4. 使⽤⽅便,⼀次可以定义多个常量
  5. 枚举常量是遵循作⽤域规则的,枚举声明在函数内,只能在函数内使⽤

2.3枚举类型的使用

使用枚举常量给枚举变量赋初值,
是不是感觉很巧妙呢?

enum Color//颜⾊
{
	RED = 1,
	GREEN = 2,
	BLUE = 4
};
enum Color clr = GREEN;
int main()
{
	printf("%d\n", clr);//2
	return 0;
}
  • 那是否可以拿整数给枚举变量赋值呢?

在C语⾔中是可以的,但是在C++是不⾏的,C++的类型检查⽐较严格。


好了,以上就是摆子今天给大家带来的关于自定义类型——联合和枚举 的有关内容了。本人学识浅薄,若有纰漏之处,还请大家多多指正,别忘了一键三连哦!!!

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值