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语言枚举与联合体用法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Qt实现数据导出到xls的示例代码

    Qt实现数据导出到xls的示例代码

    导入导出数据到csv由于语法简单,适用场景有限,于是本文将为大家介绍Qt如何实现导出数据到xls,感兴趣的小伙伴可以跟随小编一起试一试
    2022-01-01
  • VS+Qt+Halcon 显示图片,实现鼠标缩放、移动图片

    VS+Qt+Halcon 显示图片,实现鼠标缩放、移动图片

    本篇博文记录一下,用VS+Qt+Halcon实现对图片的读取以及鼠标缩放,移动(鼠标事件调用了halcon自带的算子)的过程。感兴趣的可以了解一下
    2021-08-08
  • 一文带你了解C++中deque的使用

    一文带你了解C++中deque的使用

    C++中的deque是一种双端队列,可以在队列的前端和后端进行插入元素和删除操作,同时可以视作一个长度不定的数组,支持高效的插入和删除操作。本篇文章将深入探讨C++中的deque的使用,感兴趣的可以了解一下
    2023-05-05
  • socket编程之bind()函数使用示例详解

    socket编程之bind()函数使用示例详解

    这篇文章主要为大家介绍了socket编程之bind()函数使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • C语言实现队列的示例详解

    C语言实现队列的示例详解

    队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(head)进行删除操作,而在表的后端(tail)进行插入操作。本文将用C语言实现队列,感兴趣的可以了解一下
    2022-06-06
  • C++针对bmp格式解析实例

    C++针对bmp格式解析实例

    这篇文章主要介绍了C++针对bmp格式解析实例,设计CWnd框架的使用及位图的操作,需要的朋友可以参考下
    2014-10-10
  • C/C++中一次性执行多个DOS命令的实现思路

    C/C++中一次性执行多个DOS命令的实现思路

    在C语言中执行DOS命令的方法很多,在这就不一给大家一一介绍了,本文重点给大家介绍C/C++中一次性执行多个DOS命令的实现思路,需要的朋友参考下
    2017-12-12
  • C++对象内存分布详解(包括字节对齐和虚函数表)

    C++对象内存分布详解(包括字节对齐和虚函数表)

    下面小编就为大家带来一篇C++对象内存分布详解(包括字节对齐和虚函数表)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • C++语言实现线性表之链表实例

    C++语言实现线性表之链表实例

    这篇文章主要介绍了C++语言实现线性表之链表,实例分析了C++实现线性表中链表的原理与相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-04-04
  • c与c++之间的相互调用及函数区别示例详解

    c与c++之间的相互调用及函数区别示例详解

    这篇文章主要为大家介绍了c与c++相互调用的使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06

最新评论