C语言中枚举与联合体的使用方法(enum union)

 更新时间:2021年09月24日 09:08:25   作者:呋喃吖  
枚举的意思就是列举,将每一个可能的取值都进行一一列举,下面这篇文章主要给大家介绍了关于C语言中枚举与联合体的使用方法,需要的朋友可以参考下

enum的定义

枚举顾名思义就是一一列举,把可能的取值一一列举。

枚举的使用方式

//定义一个枚举Color的类型

enum Color // enum Color 是一个类型
{
	RED,  //逗号结尾
	GREEN,
	BLUE // 最后一个成员没有逗号没有分号
};
int main()
{
	printf("%d",RED);//0
	printf("%d",GREEN);//1
	printf("%d",BLUE);//2
	return 0;
}

{}中的内容是枚举类型的可能取值,也叫 枚举常量 。 这些可能取值都是有值的,默认从0开始,一次递增1,当然在定义的时候也可以赋初值。从赋值的地方开始,后面的枚举常量没赋值的话,也是从最后一次枚举常量赋值的地方赋值地方开始依次递增1数值

enum Color//颜色
{
	RED=1,
	GREEN=2,
	BLUE=4
};
int main()
{
	printf("%d",RED);//1
	printf("%d",GREEN);//2
	printf("%d",BLUE);//4
	return 0;
}

或者这样

enum Color//颜色
{
	RED=10,
	GREEN,
	BLUE
};
int main()
{
	printf("%d",RED);//10
	printf("%d",GREEN);//11
	printf("%d",BLUE);//12
	return 0;
}

当然枚举是类型还可以定义变量:

这个变量可以赋值枚举常量的可能取值

enum Color//颜色
{
	RED=10,
	GREEN,
	BLUE
};
int main()
{
	enum Color c = RED; //定义枚举变量,给它赋值枚举常量的可能取值RED
	printf("%d",c); //10
	c = GREEN;
	printf("%d",c); //11
		//	注意点,枚举常量是常量,所以不可以在使用过程中修改他的值
		//RED = 3; //是错误的
	return 0;
}

enum对比#define宏常量的好处

枚举的优点:

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

union的定义

union 是共用体,它的意思就是union 里面成员变量的集合是公用内存空间的。

比如

//联合类型的声明
union Un
{
char c;
int i;
};
//联合变量的定义
union Un un;
//计算连个变量的大小
printf("%d\n", sizeof(un)); //结果为4

成员变量 c占用一个字节,成员变量i占用4个字节,但是又一个字节和成员变量重叠了,这就是共用体

联合体大小的计算

联合的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小
当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。

union Un1
{
	char c[5];
	int i;
};
union Un2
{
	short c[7];
	int i;
};
	//下面输出的结果是什么?
	printf("%d\n", sizeof(union Un1)); //结果为8
	printf("%d\n", sizeof(union Un2));//结果为16

分析:

  • 对于Un1,我们知道Un1的最大对齐数是4,假如没有按对齐数的话,其大小为5,有对齐数,就变为8;
  • 对于Un2,我们知道Un2的最大对齐数是4,假如没有对齐数的话,其大小为14,有对齐数,就变为16;

联合体配合算大小端的问题

记得之前用类型转化的方式计算得到计算机是大小端,现在我们可以用联合体也得到计算机的大小端;

类型转化得到大小端的方式

int check()
{
	int a = 1; // 0x 00 00 00 01
	//低地址 ----------------------->高地址
	//小端:01 00 00 00
	//大端:00 00 00 01
	return *(char*)&a;
}
int main()
{
	int ret = check();
	
	if(ret == 1)
		printf("小端模式");
	else
		printf("大端模式");
	
	return 0;
}

联合体的方式

union Un
{
	char c;
	int i;	
};
int cheak()
{
	u.i = 1;
	//低地址 ----------------------->高地址
	//小端:01 00 00 00
	//大端:00 00 00 01
	
	//如果是小端,返回1,不是返回0
	
	return u.c;	
}
int main()
{
	int ret = check();
	
	if(ret == 1)
		printf("小端模式");
	else
		printf("大端模式");
	
	return 0;
}

总结

到此这篇关于C语言中枚举与联合体使用的文章就介绍到这了,更多相关C语言枚举与联合体用法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++实现一个简单消息队列的示例详解

    C++实现一个简单消息队列的示例详解

    消息队列在多线程的场景有时会用到,尤其是线程通信跨线程调用的时候,就可以使用消息队列进行通信。本文将利用C++实现一个简单的消息队列,感兴趣的可以了解一下
    2022-12-12
  • C语言汉诺塔的简单了解

    C语言汉诺塔的简单了解

    这篇文章主要给大家介绍了关于C语言汉诺塔的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • C语言实现发送邮件功能

    C语言实现发送邮件功能

    这篇文章主要为大家详细介绍了C语言实现发送邮件功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • C语言内存泄露很严重的解决方案

    C语言内存泄露很严重的解决方案

    这篇文章主要介绍了C语言内存泄露很严重的解决方案,预防内存泄漏问题有多种方法,比如加强代码检视、工具检测和内存测试等,下面文章总结内容需要的小伙伴可以参考一下
    2022-05-05
  • C语言编程技巧 关于const和#define的区别心得

    C语言编程技巧 关于const和#define的区别心得

    尽量用const和inline而不用#define 这个条款最好称为:“尽量用编译器而不用预处理”,因为#define经常被认为好象不是语言本身的一部分。这是问题之一。再看下面的语句:
    2013-02-02
  • c++验证哥德巴赫猜想

    c++验证哥德巴赫猜想

    这篇文章主要介绍了c++验证哥德巴赫猜想,哥德巴赫猜想就是任一大于2的偶数,都可表示成两个素数之和,需要的朋友可以参考下
    2014-04-04
  • C++有限状态机实现计算器小程序

    C++有限状态机实现计算器小程序

    这篇文章主要为大家详细介绍了C++有限状态机实现计算器小程序的相关资料,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • C语言实现英文文本词频统计

    C语言实现英文文本词频统计

    这篇文章主要为大家详细介绍了C语言实现英文文本词频统计,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • 数据结构 红黑树的详解

    数据结构 红黑树的详解

    这篇文章主要介绍了数据结构 红黑树的详解的相关资料,数据结构中的二叉树查找,红黑树的讲解,需要的朋友可以参考下
    2017-07-07
  • C语言实现JSON解析器的方法步骤

    C语言实现JSON解析器的方法步骤

    JSON是一种非常流行的数据格式,本文主要介绍了C语言实现JSON解析器的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-08-08

最新评论