iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言关于自定义数据类型之枚举和联合体详解
  • 434
分享到

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

2024-04-02 19:04:59 434人浏览 泡泡鱼
摘要

目录前言枚举枚举类型的定义枚举类型的优点枚举类型的使用枚举中需要注意的点联合体联合体类型的定义联合体的特点联合体的使用联合体存在内存对齐结语前言 在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
}clr1,clr2;//在最后这里,我们定义了两个枚举变量

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


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

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

使用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.

结语

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

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

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

谢谢支持!

在这里插入图片描述

到此这篇关于C语言关于自定义数据类型之枚举和联合体详解的文章就介绍到这了,更多相关C语言 自定义数据类型内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

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

本文链接: https://www.lsjlt.com/news/157852.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C语言关于自定义数据类型之枚举和联合体详解
    目录前言枚举枚举类型的定义枚举类型的优点枚举类型的使用枚举中需要注意的点联合体联合体类型的定义联合体的特点联合体的使用联合体存在内存对齐结语前言 在C语言的自定义数据类型中,除了我们...
    99+
    2024-04-02
  • C语言自定义数据类型的结构体、枚举和联合详解
    结构体基础知识 首先结构体的出现是因为我们使用C语言的基本类型无法满足我们的需求,比如我们要描述一本书,就需要书名,作者,价格,出版社等等一系列的属性,无疑C语言的基本数据类型无法解...
    99+
    2024-04-02
  • C语言自定义类型详解(结构体、枚举、联合体和位段)
    目录前言一、结构体1、结构体类型的声明2、结构体的自引用3、结构体变量的定义和初始化4、结构体内存对齐5、结构体传参二、位段1、位段的定义 2、位段的内存分配3、位段的应用...
    99+
    2024-04-02
  • C语言中的自定义类型之结构体与枚举和联合详解
    目录1.结构体1.1结构的基础知识1.2结构的声明1.3特殊的声明1.4结构的自引用1.5结构体变量的定义和初始化1.6结构体内存对齐1.7修改默认对齐数1.8结构体传参2.位段2....
    99+
    2024-04-02
  • C语言自定义类型超详细梳理之结构体枚举联合体
    目录一、什么是结构体1.结构体实现2.匿名结构体类型3.结构体自引用4.结构体的内存对齐5.结构体位段 二、什么是枚举1.枚举类型的定义2.枚举的优点三、联合(共用体)1.什么是联合...
    99+
    2024-04-02
  • C语言深入探究自定义类型之结构体与枚举及联合
    目录1.结构体1.1结构体类型的声明1.2结构的自引用1.3结构体变量的定义和初始化1.4结构体内存对齐1.5结构体传参1.6结构体实现位段(位段的填充&可移植性)2.枚举2...
    99+
    2024-04-02
  • C语言结构体,枚举,联合体详解
    目录1.什么是结构体、枚举、联合体2.定义结构体2.1 包含结构体成员变量、variable2.2 tag、结构体成员变量2.3 用结构体声名变量2.4 用typedef 创建新类型...
    99+
    2024-04-02
  • C语言枚举与联合体深入详解
    目录前言枚举枚举的定义枚举的使用枚举的优点联合(共用体)联合体的定义联合体的特点联合体大小的计算总结前言 在C语言中,有三个自定义类型——结构体,枚举,联合,...
    99+
    2024-04-02
  • 详解C语言结构体,枚举,联合体的使用
    目录一、匿名结构体二、结构体的自引用1、声明时不要自己引用自己2、结构体重命名时不能使用重命名三、结构体内存对齐规则1、结构体内存计算2、结构体嵌套3、通过调整结构体成员顺序,压缩内...
    99+
    2024-04-02
  • 怎么在C语言中自定义结构体和枚举
    这篇文章将为大家详细讲解有关怎么在C语言中自定义结构体和枚举,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。C语言是什么C语言是一门面向过程的、抽象化的通用程序设计语言,广泛应用于底层开发,使...
    99+
    2023-06-14
  • c语言中如何自定义结构体、位段和枚举
    这篇文章主要介绍了c语言中如何自定义结构体、位段和枚举的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇c语言中如何自定义结构体、位段和枚举文章都会有所收获,下面我们一起来看看吧。结构体类型创建:struct St...
    99+
    2023-06-17
  • C语言:自定义类型详解
    目录一、结构体1.结构体变量的定义及初始化2.结构体内存对齐3.为什么要内存对齐呢?二、位段1.什么是位段2.位段的内存分配三、枚举1.枚举的定义2.枚举的优点四、联合(共用体)1....
    99+
    2024-04-02
  • C语言中自定义类型详解
    目录结构大小offsetof结构体对齐规则存在原因总结结构大小 我们先随便给出一个结构体,为了计算他的大小,我给出完整的打印方案: typedef struct num { cha...
    99+
    2024-04-02
  • C语言数据类型枚举enum全面详解示例教程
    目录一、枚举类型的定义二、枚举类型的使用2.1创建变量2.2一些优点总结一、枚举类型的定义 enum Day//enum Day是一种类型 { Mon,//周一到周日这些叫枚举...
    99+
    2024-04-02
  • 最新C语言自定义类型详解
    目录前言结构体结构体的基础知识结构和数组的区别结构体的声明结构体的特殊声明 结构体的自引用我们能不能结构体套结构体呢?那么怎么实现结构体自引用呢?结构体变量的定义和初始化我...
    99+
    2023-01-13
    C语言 自定义类型 C自定义类型详解
  • C语言深入了解自定义数据类型的使用
    目录一、自定义数据类型(上)二、自定义数据类型(中)​​​​​三、自定义数据类型(下)​​​​​一、自定义数据类型(上) 类型命名关键字 (typedef) C语言中可以对类型赋予新...
    99+
    2024-04-02
  • C语言结构体数组的定义和使用详解
    目录介绍结构体数组定义时初始化补充介绍 一个结构体变量可以存放一个学生的一组信息,可是如果有 10 个学生呢?难道要定义 10 个结构体变量吗?难道上面的程序要复制和粘贴 10 次吗...
    99+
    2024-04-02
  • C语言详解数据结构与算法中枚举和模拟及排序
    目录枚举连号区间数递增三元组二分双指针前缀和模拟特别数的和错误票据排序快速排序归并排序枚举 连号区间数 来源:第四届蓝桥杯省赛C++B组,第四届蓝桥杯省赛JAVAB组 小明这些天一直...
    99+
    2024-04-02
  • C语言函数基础教程分类自定义参数及调用示例详解
    目录1.  函数是什么?2.  C语言中函数的分类2.1 库函数2.1.1 为什么要有库函数2.1.2 什么是库函数2.1.3 主函数只能是main()吗2.1.4常见的库函数2.2...
    99+
    2024-04-02
  • C语言修炼之路数据类型悟正法解析存储定风魔下篇
    目录(壹)大端小端藏端倪1.1 什么是大端小端1.2 大端小端模式1)大端模式:2)小端模式:1.3 为什么有大端和小端1.4 如何判断机器的字节序(二) 浮点型在内存中的存储2.1...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作