纯净、安全、绿色的下载网站

首页|软件分类|下载排行|最新软件|IT学院

当前位置:首页IT学院IT技术

C语言 自定义数据类型 C语言关于自定义数据类型之枚举和联合体详解

Ersansui   2021-11-20 我要评论
想了解C语言关于自定义数据类型之枚举和联合体详解的相关内容吗Ersansui在本文为您仔细讲解C语言 自定义数据类型的相关知识和一些Code实例欢迎阅读和指正我们先划重点:C语言,枚举数据类型,C语言,联合体数据类型下面大家一起来学习吧

前言

在C语言的自定义数据类型中除了我们最为常用的结构体之外还有两个比较少用的自定义数据类型分别为枚举和联合体(也可以称为共用体)

今天我们一起看学习一下相关的知识吧!

在这里插入图片描述

枚举

什么是枚举?

顾名思义就是一一列举把所有的情况所有的取值一一列举出来

在我们生活中有不少的东西是可以全部列举出来的

如一个星期有七天一年有十二个月性别有男和女评价有优秀、良好、及格和不及格等等

当某些数据的值只有固定的几种可能取值的时候我们就可以使用枚举类型

枚举类型的定义

enum 枚举类型名 { 枚举值1 枚举值2… 枚举值n }

枚举类型的定义和结构体类似先使用enum这个关键字后面加上枚举类型的名字括号内是枚举的值最后别忘记分号

还有最后的一个枚举值后面不需要逗号!

一般定义枚举类型的方法如下:

注意:这是定义枚举类型而不是定义枚举变量!

例如如下:

enum Day//星期
{
	Mon,
	Tues,
	Wed,
	Thur,
	Fri,
	Sat,
	Sun
};



enum Sex//性别
{
	MALE,
	FEMALE,
	SECRET
};


enum Color//颜色
{
	RED,
	GREEN,
	BLUE
};

此外还有其他的一些定义的方法

枚举类型的优点

那么我们来思考一个问题为什么需要枚举呢?

我们其实可以通过#define的方式来定义常量那么我们还需要定义枚举吗?

其实是需要的

在有些情况下枚举可以让我们的代码更加清晰明了

比如我们在需要打印菜单的时候就需要有不同的选项那么每一个选项就对应一个值那么我们可以使用枚举让数值与对应的含义对上号那么这就可以让我们在实现每一个具体的细节的时候知道这一种case情况对应的具体含义

此外还有别的优点:

  • 防止了命名污染(封装)
  • 便于调试
  • 使用方便一次可以定义多个常量

枚举类型的使用

通过枚举类型我们可以定义枚举变量

enum Color//颜色
{
	RED,
	GREEN,
	BLUE
};


//使用方法和其他类型一直就像int a一样
enum Color clr;

//使用枚举值来给枚举类型赋值
clr = RED

//注意一般我们给枚举赋值的时候都用枚举值而不用其他的值否则就没有什么意义了


我们一般使用结构体的时候都像上面的栗子一样

先创建好枚举的模板燃用这个模板来创建变量

此外还有其他的方法:

创建模板的同时定义枚举变量

enum Color//颜色
{
	RED,
	GREEN,
	BLUE
}clr1clr2;//在最后这里我们定义了两个枚举变量

省略枚举类型名字匿名创建枚举变量

enum 
{
	RED,
	GREEN,
	BLUE
}clr1clr2;//这里定义了两个枚举变量

上面的两个变量依旧可以使用只是我们没有写出该枚举类型的名字就只能这样来定义变量以后不能在利用这个模板来创建变量了

使用typedef来给枚举类型重命名

typedef enum Color//颜色
{
	RED,
	GREEN,
	BLUE
}cr;//注意这里的cr是新的枚举类型名字不是定义的枚举变量



//还可以匿名重命名

typedef enum 
{
	RED,
	GREEN,
	BLUE
}cr;

枚举中需要注意的点

  • 枚举值只能是整型的数据如字符、整数等不能是浮点型
  • 枚举类型变量赋值的时候一般用枚举值来赋值不适用其他的数值来赋值
  • 枚举值本身是一个常量我们可以对枚举变量的值进行修改但不能对枚举值进行修改
  • 枚举值被处理的时候会被看成整数数值因此枚举变量可以算术运算、关系运算等

联合体

联合体类型的定义

union 联合体类型名 { 数据类型 成员名1  数据类型 成员名 2  …  数据类型 成员名n}

联合体也叫共用体这个也是一种特殊的数据类型

这种类型定义的变量也包含一系列的成员特征是这些成员公用同一块空间

栗子如下:

union Un
{
	char c;
	int i;
};

联合体的特点

联合体变量的成员是使用共同的一块空间的

联合体的大小至少是成员中最大成员的大小
(这里的至少我们后面再说)

#include<stdio.h>

union Un
{
	int i;
	char c;
};
union Un un;


int main() {

	// 下面输出的结果是一样的吗?
	printf("%p\n", &un);
	printf("%p\n", &(un.i));
	printf("%p\n", &(un.c));

	return 0;
}

运行上面的代码我们会发现三个地址都相同

在这里插入图片描述

成员变量i是第一个成员该地址和联合体的地址相同我们可以理解c作为第二个成员变量其地址也是和第一个成员变量的地址相同那么这就说明它们确实使用的是同一块空间

联合体的使用

联合体类型定义变量的方法和结构体、枚举类似都有多种方法

先创建模板在定义变量

union Un
{
	int i;
	char c;
};
union Un un;

创建模板的同时定义变量

union Un
{
	int i;
	char c;
}un;//此处的un是一个联合体变量

匿名定义联合体变量

union 
{
	int i;
	char c;
}un;//此处的un是一个联合体变量

同样的由于联合体类型名的省略我们只可以这样来定义变量后面就再也不能使用该模板来定义变量了

typedef重命名联合体类型名

typedef union Un
{
	int i;
	char c;
}un;


typedef union
{
	int i;
	char c;
}un;


联合体存在内存对齐

上面说到联合体的大小至少是最大成员变量的大小为什么是至少呢?

我们先来看下面的栗子:

union Un 
{
	char arr[6];
	short s;
};

union Un u;

int main() {

	// 下面输出的结果是一样的吗?
	printf("%u", sizeof(union Un));

	return 0;
}

上面的代码输出的结果为6

如果我们把字符数组的大小改成5会发现大小还是6

这是因为联合体中也存在着对齐

上面的栗子中会认为字符数组的默认对齐数为1而short的默认对其数位2但是成员变量的大小会根据数组的大小来计算而不是根据数组的元素类型假如你是元素个数为6的字符数组那么大小就是6元素个数为5的字符数组大小就是5而int、short等数据类型就按照默认的大小来计算

首先需要联合体的大小至少是最大成员变量的大小

然后要求大小应该为各个成员变量中最大对齐数的倍数如果不是倍数那么对齐到整数倍处

这就能说明为什么上面的代码把字符数组的大小改为5个元素的时候联合体的大小仍然为6.

结语

今天的分享到这里就结束啦!

由于本人能力有限难免会有出错的地方还希望各位能够指出!

希望各位能给我点个赞、点个收藏哦~

谢谢支持!

在这里插入图片描述


相关文章

猜您喜欢

网友评论

Copyright 2020 www.fresh-weather.com 【世纪下载站】 版权所有 软件发布

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 点此查看联系方式