c语言-枚举和联合体


前言

本篇文章介绍c语言中的枚举类型和联合体类型

一、枚举类型

1.1 枚举类型的定义

枚举类型和结构体类型相似,都是一种自定义类型。
定义枚举类型的关键字:enum
枚举类型的定义格式

enum 枚举名
{
	枚举元素1,
	枚举元素2,
	...
};

例如,定义一个星期作为枚举类型

enum WEEK
{
	Mon,
	Tues,
	Wed,
	Thus,
	Fri,
	Sat,
	Sun
};

枚举类型的第一个成员的取值默认为0,依次往后递增1,
输出枚举WEEK每个成员的值
在这里插入图片描述

修改枚举类型成员的默认值

enum WEEK
{
	Mon = 1, //修改默认值为1
	Tues,
	Wed,
	Thur,
	Fri,
	Sat,
	Sun
};

输出修改后枚举WEEK每个成员的值
在这里插入图片描述

1.2 枚举类型的使用

在这里插入图片描述
把一个整型值赋值为枚举类型变量

	int a = 1;
	enum WEEK day;
	day = (enum WEEK)a; //类型转换

1.3 枚举的优点

  1. 增加代码的可读性和可维护性
  2. 与#define定义的标识符相比,枚举有类型检查,更加严谨
  3. 防止命名污染
  4. 便于调试
  5. 使用方便,一次可以定义多个常量

二、联合体类型

2.1 联合体类型的定义

联合体类型也是一种自定义类型
定义联合体类型的关键字:union
联合体类型定义的格式

union 联合体名
{
	类型1 成员名;
	类型2 成员名;
	...
};

例如,定义一个联合体类型Un

union Un
{
	int i;
	char c;
};

联合体类型与结构体类型,枚举类型相似,也可以定义匿名联合体,例如

//定义一个匿名联合体
//定义匿名联合体时,和匿名结构体类型,必须同时定义匿名联合体变量
//my_union就是匿名联合体类型变量
union
{
	int i;
	char c;
}my_union;

2.2 联合体类型的特点

联合体的成员共用一块内存空间,因此也称联合体为共用体。
定义一个联合体

union Un
{
	int i;
	char c;
};

输出联合体Un的大小
在这里插入图片描述
输出联合体成员的地址
在这里插入图片描述
由输出结果可知,联合体u的成员i的地址和成员c的地址相同,说明两个成员指向同一块空间的起始位置,共用一块空间。

联合体u的内存情况如下
在这里插入图片描述

练习:使用联合体判断大小端

代码实现

int check_sys()
{
	union  //定义匿名联合体
	{
		int i;
		char c;
	}uu;

	uu.i = 1;
	//1的16进制形式 0x00000001
	//低地址->高地址(32位机器)
	//大端字节序 00 00 00 01  
	//小端字节序 01 00 00 00 
	//uu.c = 0 则为大端字节序
	//uu.c = 1 则为小端字节序
	return uu.c;
}

输出结果
在这里插入图片描述


2.3 联合体大小的计算

  • 当联合体的最大成员是最大对齐数的整数倍,则联合体大小等于最大成员的大小
union Un
{
	int i;
	char c;
};

联合体Un的最大成员为4个字节,联合体的最大对齐数为4,那么i的大小即为联合体的大小

  • 当联合体的最大成员不是最大对齐数的整数倍时,则联合体大小需对齐到最大对齐数的整数倍
union Un_2
{
	char str[5];
	int i;
};

分析联合体大小:

联合体成员 char str[5],大小为5个字节
当成员为数组时,数组的对齐数为元素类型的大小,vs默认对齐数为8
则str的对齐数为1
联合体成员int i ,大小为4个字节 ,vs默认对齐数为8
则i的对齐数4
联合体的最大对齐数为4
联合体的最大成员为5个字节,不是最大对齐数的整数倍
则联合体大小对齐到8个字节

输出联合体大小:

在这里插入图片描述


总结

本篇文章首先介绍c语言的枚举类型定义以及枚举类型的使用;最后介绍联合体类型的定义、联合体的特点以及如何计算联合体的大小。

  • 17
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值