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

目录
  • enum的定义
  • enum对比#define宏常量的好处
  • union的定义
  • 联合体大小的计算
  • 联合体配合算大小端的问题
  • 总结

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

(0)

相关推荐

  • C语言中结构体、联合体的成员内存对齐情况

    前言 最近项目进行中,遇到一个小问题,在数据协议传输过程中,我为了方便解析,就定义了一个结构体,在数据的指针传入函数的时候,我用定义好的结构体进行强制转化,没想到一直解析失败,调试很久,终于反应过来,在用结构体指针对数据强制转换时,定义结构体我没有注意到数据对齐,因为在底层实现中,我传入的数据buffer是排列整齐的,而强制转化的结构体格式中,我定义的时候没有使用__attribute__((__packed__))或者__packed强制数据对齐,导致结构体成员真实排列会按照成员中最大的变量的

  • C语言结构体,枚举,联合体详解

    目录 1.什么是结构体.枚举.联合体 2.定义结构体 2.1 包含结构体成员变量.variable 2.2 tag.结构体成员变量 2.3 用结构体声名变量 2.4 用typedef 创建新类型 2.5 两个结构体相互包含 2.6 结构体变量初始化 2.7 结构体指针 3.枚举 3.1 定义方式 3.2 为什么用枚举 3.3 枚举变量的定义 3.4 实例 3.5 枚举实际用途 4.联合体 4.1 与结构体区别 4.2 定义 总结 1.什么是结构体.枚举.联合体 结构体(struct)是由一系列具

  • C语言结构体的具体使用方法

    目录 初识C语言结构体 1.为什么要有结构体 2.结构体的定义 2.1结构体类型的定义 2.2定义结构体普通变量及访问 2.3定义结构体指针变量及访问 初识C语言结构体 1.为什么要有结构体 (1)之前int.char等类型描述的结构体非常单一,只可描述一种类型. (2)数组也是描述同一类型的集合,只可描述一种类型. (3)而结构体使得C语言可以描述复杂类型,比如学生类型( 包含学生的名字.年龄.性别.电话号等信息). 结构体和数组的区别: ·结构体:用来描述相同/不同数据元素类型的集合. ·数

  • C语言入门篇--初识结构体

    目录 1.为什么要有结构体 2.结构体的定义 2.1结构体类型的定义 2.2定义结构体普通变量及访问 2.3定义结构体指针变量及访问 1.为什么要有结构体 (1)之前int.char等类型描述的结构体非常单一,只可描述一种类型. (2)数组也是描述同一类型的集合,只可描述一种类型. (3)而结构体使得C语言可以描述复杂类型,比如学生类型( 包含学生的名字.年龄.性别.电话号等信息). 结构体和数组的区别: 结构体:用来描述相同/不同数据元素类型的集合. 数组:用来描述具有相同数据元素类型的集合.

  • C语言自定义类型详解(结构体、枚举、联合体和位段)

    目录 前言 一.结构体 1.结构体类型的声明 2.结构体的自引用 3.结构体变量的定义和初始化 4.结构体内存对齐 5.结构体传参 二.位段 1.位段的定义 2.位段的内存分配 3.位段的应用 三.枚举 1.枚举类型的定义 2.枚举的优点 3.枚举的使用 四.联合体(共用体) 1.联合体的定义 2.联合体的特点 3.联合体的大小计算 总结 前言 一.结构体 1.结构体类型的声明 当我们想要描述一个复杂变量--学生,可以这样声明. ✒️代码展示: struct Stu { char name[20

  • c语言枚举类型enum的用法及应用实例

    目录 前言 一.枚举的概念 二.枚举的几种用法 1.直接定义枚举值,然后给普通变量赋值. 2.定义带名称的枚举 三.定义枚举别名 四.枚举有什么用,用在哪里? 最后总结: 前言 今天跟大家讲一下我在产品开发时,用枚举(enum)的一些骚操作. 我跟你保证,今天的内容绝对是你在书本和视频学不到的. 为什么要讲枚举呢? 因为我发现它是一个容易被遗忘,同时又非常重要的关键词,大家如果看那些大佬写的程序,真的会发现有非常非常多enum的应用. 让我惊奇的是市面上的一些C语言书籍以及视频课程并没有重视去讲

  • C语言枚举(enum)和联合(union)实例分享

    使用enum进行定义 /* 枚举类型演示 */ #include <stdio.h> int main() { enum /*季节*/ {CHUN, XIA = 5, QIU, DONG}; printf("QIU是%d\n", QIU); } 使用union联合进行定义 /* 联合演示 */ #include <stdio.h> typedef union{ int val; float fval1; } tmp; int main(){ tmp utmp =

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

    目录 enum的定义 enum对比#define宏常量的好处 union的定义 联合体大小的计算 联合体配合算大小端的问题 总结 enum的定义 枚举顾名思义就是一一列举,把可能的取值一一列举. 枚举的使用方式 //定义一个枚举Color的类型 enum Color // enum Color 是一个类型 { RED, //逗号结尾 GREEN, BLUE // 最后一个成员没有逗号没有分号 }; int main() { printf("%d",RED);//0 printf(&qu

  • C语言中枚举与指针的实例详解

     C语言中枚举与指针的实例详解 总结一下, 定义枚举,用typedef enum关键字, 比如 typedef enum{Red,Green,Blue} Color3; 枚举到数值的转换,如果没有指定代表数值就是从0开始算, 比如 Color3 c=Red; printf("%d",c);会显示0, 除非指定 如typedef enum{Red=3,Green=5,Blue=10} Color3; 关于类型指针的定义, 定义的时候在变量名左边加*代表此变量只是一个空指针而已, 若需要赋

  • c语言中字符串分割函数及实现方法

    1.问题引入 自己在写一个linux下的模拟执行指令的时候,遇到了输入"cat a.c",要将该字符串分解成cat和a.c两个单独的字符串,虽然知道有strtok的存在,但是想自己尝试写一下,于是就自己写了一个,不过总是遇到这样或那样的问题,虽然最后调通了,不过确浪费了不少时间:后来作业交上去以后又仔细阅读了strtok函数,发现原来linux下已经改成strsep,所有在这里就写一下自己所走的过程. 2.自己写的字符串分割函数:用于分割指令,比如cat a.c最后会被分割成cat和a

  • C#语言中字符类char的使用方法(总结)

    char类在C#中表示一个unicode字符,正是这些unicode字符构成了字符串.unicode字符是目前计算机中通用的字符编码,它为针对不同语言中的每个字符设定了统一的二进制编码,用于满足跨越语言.跨平台的文本转换.处理要求.char的定义非常简单,如下: char ch1='z': 但是,char只能定义一个unicode字符. 下面是char类常见的使用方法及说明 iscontrol   指示指定的unicode字符是否属于控制字符类别 isdigit  指示某个unicode字符是否

  • C语言中栈的两种实现方法

    栈的两种实现方式 通常情况下,栈的实现方式有两种,一种方法是使用指针,而另一种方法则是使用数组.但是在调用程序时,我们没有必要知道具体使用了哪种方法. 一.顺序栈 #include<stdio.h> #include<stdlib.h> #define maxsize 64 //定义栈 typedef struct { int data[maxsize]; int top; }sqstack,*sqslink; //设置栈空 void Clearstack(sqslink s) {

  • C/C++语言中全局变量重复定义问题的解决方法

    前言 在C语言中使用extern 关键字来定义全局变量的时候,我们需要在.h文件和.c文件中重复定义,这种重复,导致了出错几率的增加. 今天,在整理自己的代码的时候,考虑到我写的代码从一至终都是在一个cpp文件里面.于是,想把自己的代码中的各个模块分离开来,以便更好地阅读和管理. 遇到的问题 我的做法是: 宏定义.结构体定义.函数声明以及全局变量定义放到一个head.h头文件中 函数的定义放到head.cpp中 main函数放到main.cpp中 然而却报错了,提示xxx变量在*.obj文件中已

  • 举例说明易语言中枚举常量的使用方法

    枚举 枚举(enum)是定义一组命名常量的机制,用这种方式定义的常量被称作枚举常量 注:枚举常量的数据类型是整数 使用方法: 下面我们以文本语音转换为例子,说明一下枚举常量的使用方法. 首先我们在窗体上放入语音识别控件,按钮,通用对话框这些基本控件,来制作一个简单的语音文本朗读程序. 1 如果您使用过语音识别控件,就应该知道,使用这个控件的第一步就是先创建它,而创建命令的两个参数就是枚举常量,我们可以看一下,以下代码是如何使用枚举常量的. 2 同样在机读文本的时候,我们也需要使用这些枚举常量.

  • 在go语言中安装与使用protobuf的方法详解

    简介 本文主要给大家介绍了关于go语言安装使用protobuf的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. protobuf是Google开发出来的一个语言无关.平台无关的数据序列化工具,在rpc或tcp通信等很多场景都可以使用.通俗来讲,如果客户端和服务端使用的是不同的语言,那么在服务端定义一个数据结构,通过protobuf转化为字节流,再传送到客户端解码,就可以得到对应的数据结构.这就是protobuf神奇的地方.并且,它的通信效率极高,"一条消息数据,用pr

  • C语言中设置进程优先顺序的方法

    C语言setpriority()函数:设置程序进程执行优先权 头文件: #include <sys/time.h> #include <sys/resource.h> 定义函数: int setpriority(int which, int who, int prio); 函数说明:setpriority()可用来设置进程.进程组和用户的进程执行优先权.参数which 有三种数值, 参数who 则依which 值有不同定义. which who 代表的意义: 1.PRIO_PROC

  • C语言中读取时间日期的基本方法

    C语言time()函数:获取当前时间(以秒数表示) 头文件: #include <time.h> 定义函数: time_t time(time_t *t); 函数说明:此函数会返回从公元 1970 年1 月1 日的UTC 时间从0 时0 分0 秒算起到现在所经过的秒数.如果t 并非空指针的话,此函数也会将返回值存到t 指针所指的内存. 返回值:成功则返回秒数,失败则返回((time_t)-1)值,错误原因存于errno 中. 范例 #include <time.h> main(){

随机推荐