c语言-枚举和联合体

文章目录

  • 前言
  • 一、枚举类型
    • 1.1 枚举类型的定义
    • 1.2 枚举类型的使用
    • 1.3 枚举的优点
  • 二、联合体类型
    • 2.1 联合体类型的定义
    • 2.2 联合体类型的特点
    • 2.3 联合体大小的计算
  • 总结


前言

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

一、枚举类型

1.1 枚举类型的定义

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

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

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

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

枚举类型的第一个成员的取值默认为0,依次往后递增1,
输出枚举WEEK每个成员的值
c语言-枚举和联合体_第1张图片

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

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

输出修改后枚举WEEK每个成员的值
c语言-枚举和联合体_第2张图片

1.2 枚举类型的使用

c语言-枚举和联合体_第3张图片
把一个整型值赋值为枚举类型变量

	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的大小
c语言-枚举和联合体_第4张图片
输出联合体成员的地址
c语言-枚举和联合体_第5张图片
由输出结果可知,联合体u的成员i的地址和成员c的地址相同,说明两个成员指向同一块空间的起始位置,共用一块空间。

联合体u的内存情况如下
c语言-枚举和联合体_第6张图片

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

代码实现

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;
}

输出结果
c语言-枚举和联合体_第7张图片


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语言-枚举和联合体_第8张图片


总结

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

你可能感兴趣的:(c语言进阶,c语言)