【C语言】自定义类型——枚举、联合体

这篇具有很好参考价值的文章主要介绍了【C语言】自定义类型——枚举、联合体。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

引言

对枚举、联合体进行介绍,包括枚举的声明、枚举的优点,联合体的声明、联合体的大小。

 【C语言】自定义类型——枚举、联合体,C语言进阶,c语言,开发语言               ✨ 猪巴戒:个人主页✨

               所属专栏:《C语言进阶》

        🎈跟着猪巴戒,一起学习C语言🎈

目录

引言

枚举

枚举的优点

联合(共用体)

 联合体的内存分布

如何通过联合体检验编译器的大小端?

联合体的大小

总结:


枚举

将事物一一列举出来,每个枚举常量都有一个取值。
下面就是枚举的具体格式,Mon,Tues,Wed这些就是枚举常量,每个枚举常量之间用逗号 隔开。枚举常量用大括号括在一起,记得结尾要有分号作为结尾。
枚举中的变量都是有初始值的,默认从0开始,后面就是递增1。下图将它们各自的值打出来。
enum Day
{
	Mon,
	Tues,
	Wed,
	Thur,
	Fri,
	Sat,
	Sun
};

【C语言】自定义类型——枚举、联合体,C语言进阶,c语言,开发语言

枚举变量的取值也是可以直接定义的。 

enum Color//颜⾊
{
     RED=2,
     GREEN=4,
     BLUE=8
};

         

枚举的优点

通过定义宏,同样可以把各星期的取值打印出来。那枚举的优点是什么呢?

#define Mon 0
#define Tues 1
#define Wed 2
#define Thur 3
#define Fri 4
#define Sat 5
#define Sun 6

【C语言】自定义类型——枚举、联合体,C语言进阶,c语言,开发语言

 枚举的优点

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

2.和#define定义的标识符比较枚举有类型检查,更加严谨

枚举变量都具有类型,转换的时候会更加严格。

enum Day d = Fri;
enum Day d = 5; //在C++的语法中会报错

3.防止命名污染(封装)

enum将各枚举变量封装起来。

4.便于调试

在#define在预处理阶段,define所定义的标识符就已经被替换了,调试所看到的代码和所写代码会有所差异。

而枚举中变量是不会替换的。

        

联合(共用体)

联合是一种特殊的自定义类型

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

联合体的大小是联合体中成员的最大内存。

#include <stdio.h> 
union Un
{
	int a;
	char c;
};
int main()
{
	union Un u;
	printf("%d\n", sizeof(u));

	printf("%p\n", &u);
	printf("%p\n", &(u.a));
	printf("%p\n", &(u.c));

	return  0;
}

【C语言】自定义类型——枚举、联合体,C语言进阶,c语言,开发语言

         

 联合体的内存分布

联合体的成员共用同一块内存空间,因此联合体的大小至少是最大成员的大小。

联合体的特点:

1.联合体成员的地址是一样的

2.联合体的大小至少为最大成员的大小

联合体的成员内存是重叠的,因此联合体在同一时刻,只能使用一个联合体成员。

通过下面的例子,理解联合体的内存分布:

例子1:

#include <stdio.h>
union Un
{
	char c;
	int i;
};
int main()
{
	union Un un = { 0 };
	un.i = 0x11223344;
	un.c = 0x55;
	printf("%x\n", un.i);
	return 0;
}

 由于是小端操作系统,数据在内存在的储存为小端字节序。

绿色表示联合体成员 i 。

【C语言】自定义类型——枚举、联合体,C语言进阶,c语言,开发语言

联合体的成员的地址是一样的,但是所占的字节不同。 

红色表示的是联合体成员 c 。

【C语言】自定义类型——枚举、联合体,C语言进阶,c语言,开发语言

【C语言】自定义类型——枚举、联合体,C语言进阶,c语言,开发语言

         

如何通过联合体检验编译器的大小端?

一个数据 a = 0x11223344 在大小端字节序的不同排列

  小端字节序储存:

  • 把一个数据的低位字节序的内容存放在低地址处,把高位字节序的内容放在高地址处,就是小端字节序。

【C语言】自定义类型——枚举、联合体,C语言进阶,c语言,开发语言

 大端字节序储存:

  • 把一个数据的高位字节序的内容存放在低地址处,把低位字节序的内容放在高地址处,就是大端字节序。

int a =0x11 22 33 44(这里用十六进制是为了表达)

【C语言】自定义类型——枚举、联合体,C语言进阶,c语言,开发语言

代码: 

#include <stdio.h>
int check_sys()
{
	union Un
	{
		char c;
		int i;
	}u;
	u.i = 1;
	return u.c;
}
int main()
{
	int ret = check_sys();
	if (ret == 1)
		printf("小端\n");
	else
		printf("大端\n");
	return 0;
}

解释:

如果是小端字节序,i 在内存中是 01 00 00 00,这个时候将 c 拿出来,就是那联合体的第一个字节。如果是1,那么就是小端字节序。

【C语言】自定义类型——枚举、联合体,C语言进阶,c语言,开发语言

 如果是大端字节序,i 在内存中是 00 00 00 01,这个时候将 c 拿出来,就是那联合体的第一个字节。如果是0,那么就是大端字节序。

【C语言】自定义类型——枚举、联合体,C语言进阶,c语言,开发语言         

联合体的大小

联合体的大小也存在对齐。

当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。

对⻬数 = 编译器默认的⼀个对⻬数 与 该成员变量⼤⼩的较⼩值。

- VS 中默认的值为 8

- Linux中 gcc 没有默认对⻬数,对⻬数就是成员⾃⾝的⼤⼩

 例子1:

下面的打印结果是什么?

#include <stdio.h>
union Un
{
	char arr[5];
	int i;
};
union Un2
{
	short c[7];
	int i;
};
int main()
{
	printf("%d\n", sizeof(union Un));
	printf("%d\n", sizeof(union Un2));
	return 0;
}

Un的最大成员是 i ,4个字节的大小,arr[5]的内存如下,联合体Un的大小要对齐,对齐到4的整数倍,因此联合体Un的大小为8个字节。

【C语言】自定义类型——枚举、联合体,C语言进阶,c语言,开发语言

Un2的最大成员是 i, 4个字节的大小,short[7]的内存如下,联合体Un2的大小要对齐,对齐到4的整数倍,因此联合体Un2的大小为16个字节。

【C语言】自定义类型——枚举、联合体,C语言进阶,c语言,开发语言

 【C语言】自定义类型——枚举、联合体,C语言进阶,c语言,开发语言文章来源地址https://www.toymoban.com/news/detail-766864.html

总结:

  1. 枚举(将事物一一列举出来,每个枚举常量都有一个取值)
  2. 枚举的优点
  3. 联合体,联合体的内存分布 
  4. 联合体的大小

到了这里,关于【C语言】自定义类型——枚举、联合体的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 自定义类型——枚举与联合体

    枚举顾名思义就是一一列举 把可能的取值一一列举 以上定义的 enum Day , enum Sex 都是枚举类型  { }中的内容是枚举类型的可能取值,也叫 枚举常量 这些可能取值都是有值的,默认从0开始,一次递增1 当然在定义的时候也可以赋初值 例如: 我们可以使用 #define 定义常量,为

    2023年04月19日
    浏览(37)
  • 自定义类型:结构体、枚举、联合体

    结构体是一种自定义的数据类型,它由多个不同类型的成员变量组成,结构体可以将多个相关的数据打包在一起,方便进行管理和处理。 定义形式: struct 结构体名{ 类型 成员名1; 类型 成员名2; //更多的成员变量 }; 如描述一个学生: struct Stu这样就和int类型一样,都是数

    2024年02月16日
    浏览(41)
  • 详解自定义类型:枚举与联合体!

    目录  ​编辑 一、枚举类型 1.枚举类型的声明 2.枚举类型的优点 3.枚举类型的使用 二、联合体类型(共用体) 1.联合体类型的声明 2.联合体的特点 3.相同成员的结构体和联合体的对比 4.联合体大小的计算 5.用联合体判断大小端   三.完结散花                            

    2024年02月19日
    浏览(31)
  • 自定义类型之枚举类型(enum)和联合体类型(union)

    目录   枚举类型(enum) 什么是枚举类型? 枚举类型的使用 枚举类型的优势 枚举类型的应用场景 总结 联合体类型(union) 什么是联合体? 联合体的应用场景 联合体的注意事项 总结 枚举类型是C语言中一种非常有用的数据类型,它允许程序员定义一组命名的常量。枚举类型

    2024年02月20日
    浏览(45)
  • C/C++之自定义类型(结构体,位段,联合体,枚举)详解

    专栏分类:C语言初阶      C语言程序设计————KTV       C语言小游戏     C语言进阶 C语言刷题 欢迎大家点赞,评论,收藏。 一起努力,一起奔赴大厂。 目录 个人主页:点我进入主页   1.前言 2.结构体 2.1结构体声明 2.2结构体初始化 2.3结构体的自引用 2,4结构体的内存

    2024年02月08日
    浏览(39)
  • 【C语言】联合体和枚举

    前言 这篇博客就把剩下的两个自定义类型联合体和枚举好好总结一下,让我们好好看看联合体和枚举到底是什么 个人主页:小张同学zkf 若有问题 评论区见 感兴趣就关注一下吧 目录  1. 联合体 1.1 联合体类型的声明  1.2 联合体的特点  1.3 相同成员的结构体和联合体对比  

    2024年04月14日
    浏览(40)
  • c语言-联合体和枚举

    (1) 像结构体⼀样,联合体也是由一个或者多个成员构成,这些成员可以不同的类型。 (2)但是编译器只为最大的成员分配足够的内存空间。联合体的特点是所有成员共用同一块内存空间。所以联合体也叫:共用体。 (3) 给联合体其中⼀个成员赋值,其他成员的值也跟着

    2024年02月04日
    浏览(44)
  • c语言-枚举和联合体

    本篇文章介绍c语言中的枚举类型和联合体类型 枚举类型和结构体类型相似,都是一种自定义类型。 定义枚举类型的: enum 枚举类型的定义格式 例如,定义一个星期作为枚举类型 枚举类型的第一个成员的取值默认为0,依次往后递增1, 输出枚举WEEK每个成员的值 修改枚

    2024年01月21日
    浏览(68)
  • C语言枚举与联合体详解

        本篇文章带来 枚举与联合体 相关知识详细讲解! 如果您觉得文章不错,期待你的一键三连哦,你的鼓励是我创作的动力之源,让我们一起加油,一起奔跑,让我们顶峰相见!!! 目录 一.枚举 1.什么是枚举? 2.枚举类型的定义 3.枚举的优点 4.枚举的使用 二.联合体(共

    2024年02月15日
    浏览(43)
  • 【C语言】位段,枚举和联合体详解

      目录 1.位段 1.1 什么是位段 1.2 位段的内存分配 1.3 位段的跨平台问题 2.枚举 2.1 枚举类型的定义 2.2 枚举的优点 3. 联合(共用体) 3.1 联合类型的定义 3.2 联合的特点 3.3 联合大小的计算 位段的声明和结构体是类似的,有两个不同: 1.位段的成员必须是 int、unsigned int 或 sig

    2024年02月11日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包