【C语言】联合体和枚举

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

前言

这篇博客就把剩下的两个自定义类型联合体和枚举好好总结一下,让我们好好看看联合体和枚举到底是什么

个人主页:小张同学zkf

若有问题 评论区见

感兴趣就关注一下吧

【C语言】联合体和枚举,c语言,c语言,开发语言

目录

 1. 联合体

1.1 联合体类型的声明

 1.2 联合体的特点

 1.3 相同成员的结构体和联合体对比

 1.4 联合体大小的计算

2. 枚举类型

2.1 枚举类型的声明

2.2 枚举类型的优点

 2.3 枚举类型的使用

 


 1. 联合体

1.1 联合体类型的声明

像结构体一样,联合体也是由一个或者多个成员构成,这些成员可以不同的类型。
但是编译器只为最大的成员分配足够的内存空间。联合体的特点是所有成员共用同一块内存空间。所以联合体也叫:共用体
给联合体其中一个成员赋值,其他成员的值也跟着变化。
# include <stdio.h>
// 联合类型的声明
union Un
{
char c;
int i;
};
int main ()
{
// 联合变量的定义
union Un un = { 0 };
// 计算连个变量的⼤⼩
printf ( "%d\n" , sizeof (un));
return 0 ;
}

输出结果:4

【C语言】联合体和枚举,c语言,c语言,开发语言

由图可见他们俩共处一个空间,所以字节长度为最大的类型int

 1.2 联合体的特点

联合的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大(因为联合
至少得有能力保存最大的那个成员)。
# 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 ;
}

输出结果:11223355

【C语言】联合体和枚举,c语言,c语言,开发语言

由图可知是将最低位由于联合体的特点,覆盖成c的55。

那我们想一下,既然c和i共处一室,它们的地址会一样吗?

【C语言】联合体和枚举,c语言,c语言,开发语言

我们试一下

# include <stdio.h>
// 联合类型的声明
union Un
{
char c;
int i;
};
int main ()
{
// 联合变量的定义
union Un un = { 0 };
// 下⾯输出的结果是⼀样的吗?
printf ( "%p\n" , &(un.i));
printf ( "%p\n" , &(un.c));
printf ( "%p\n" , &un);
return 0 ;
}

输出结果:

001 AF85C
001 AF85C
001 AF85C

可见输出结果一样,这也就说明联合体地址和里面每个成员名的地址是一样的

 1.3 相同成员的结构体和联合体对比

我们再对比一下相同成员的结构体和联合体的内存布局情况。
struct S                                   
{
char c;
int i;
};
struct S s = { 0 }; 
 
union Un
{
char c;
int i;
};
union Un un = { 0 };

【C语言】联合体和枚举,c语言,c语言,开发语言

联合体相较于结构体可以节省空间,但是它会出现成员与成员覆盖的情况 

 1.4 联合体大小的计算

 我们了解了联合体在内存中的布局,那联合体的字节大小到底怎么计算那

我们首先要知道:

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

【C语言】联合体和枚举,c语言,c语言,开发语言

我们来看一个代码加深理解
# include <stdio.h>
union Un1
{
char c[ 5 ];
int i;
};
union Un2
{
short c[ 7 ];
int i;
};
int main ()
{
// 下⾯输出的结果是什么?
printf ( "%d\n" , sizeof ( union Un1));
printf ( "%d\n" , sizeof ( union Un2));
return 0 ;
}

我们先分析un1,根据前面博客分析的结构体而言,char的最大对齐数是1,int的最大对齐数为4,所以这个联合体的最大对齐数为4,联合体至少也是最大成员的空间,成员中最大的空间是char c[5],为5,5不是4的倍数,所以对齐到8的位置,就是8;再看un2,un2至少为14个字节吧,short和int的对齐数分别为2和4,所以最大对齐数为4,14不是4的倍数,所以要对齐到16的位置,大小为16。

我们认识了联合体,那我们是不是又有一种巧妙的方式判断大小端了

int check_sys ()
{
union
{
int i;
char c;
}un;
un.i = 1 ;
return un.c; // 返回 1 是⼩端,返回 0 是⼤端
}

既然char成员占据低地址处的位置,那此时i为1,返回c,正好可以直接判断这个位置上的数字。 


2. 枚举类型

枚举是 C 语言中的一种基本数据类型,用于定义一组具有离散值的常量

2.1 枚举类型的声明

枚举顾名思义就是一 一列举。
把可能的取值一 一列举。
比如我们现实生活中:
一周的星期一到星期日是有限的7天,可以一 一列举
性别有:男、女、保密,也可以⼀⼀列举
月份有12个月,也可以⼀⼀列举
三原色,也是可以一 一列举

 这些数据的表示就可以使用枚举了。

enum Day // 星期
{
Mon,
Tues,
Wed,
Thur,
Fri,
Sat,
Sun
};
enum Sex // 性别
{
MALE,
FEMALE,
SECRET
}
enum Color // 颜⾊
{
RED,
GREEN,
BLUE
};
以上定义的 enum Day enum Sex enum Color 都是 枚举类型
{}中的内容是枚举类型的可能取值,也叫 枚举常量

这些可能取值都是有值的,默认从0开始,依次递增1,当然在声明枚举类型的时候也可以赋初值。

比如:

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

若不赋初值

enum Color // 颜⾊
{
RED ,//0
GREEN ,//1
BLUE//2
};

那里面的常量值就默认从0开始依次加一

若中间赋初值

enum Color // 颜⾊
{
RED ,//0
GREEN ,//1
BLUE=8,//8
YELLOW//9
};

可见刚开始不赋初值的时候,依然从零开始依次加一,从哪开始赋初值,就从这个初值的基础上依次加一。

2.2 枚举类型的优点

这时肯定有人会想定义常量的话,那我们可以用#define宏定义呀,为什么会有枚举这东西那

相比#define枚举可以调试,而#define在调试时会直接在预处理阶段替换。

我们来看一下枚举的优点就知道了

枚举的优点:
1. 增加代码的可读性和可维护性
2. 和#define定义的标识符比较枚举有类型检查,更加严谨。
3. 便于调试,预处理阶段会删除 #define 定义的符号
4. 使用方便,一次可以定义多个常量
5. 枚举常量是遵循作用域规则的,枚举声明在函数内,只能在函数内使用

 2.3 枚举类型的使用

enum Color // 颜⾊
  {
 RED= 1 ,
 GREEN= 2 ,
 BLUE= 4
  };
  enum Color clr = GREEN;
那是否可以拿整数给枚举变量赋值呢?在C语言中是可以的,但是在C++是不行的,C++的类型检查比较严格。

结束语

枚举和联合体总结完了,这两个和上一篇的结构体都可以用typedef关键字重命名,好了全部自定义类型总结完了

OK,感谢观看

【C语言】联合体和枚举,c语言,c语言,开发语言【C语言】联合体和枚举,c语言,c语言,开发语言 【C语言】联合体和枚举,c语言,c语言,开发语言文章来源地址https://www.toymoban.com/news/detail-851332.html

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

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

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

相关文章

  • 【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日
    浏览(28)
  • C语言中的联合体和枚举

           联合体的是union 除了和结构体不一样之外,联合体的创建语法形式和结构体的很相似,如果不熟悉结构体的创建,可以看一下我上一篇的博客关于结构体知识的详解。        联合体的成员是共用一块内存空间的,这也就是意味着它更节省空间,那也就

    2024年04月10日
    浏览(46)
  • C语言 联合体验证 主机字节序 +枚举

    枚举(Enumeration)是一种在编程语言中表示一组具名 常量 的数据类型。 枚举常常用于定义一组相关的离散值,比如颜色、星期几、月份等。 爱编程的大丙

    2024年02月04日
    浏览(24)
  • C语言从入门到实战——联合体和枚举

    C语言中,联合体(union)是一种特殊的数据类型,允许存储不同类型的数据在同一块内存空间中。联合体的大小取决于其中最大的成员的大小,共享同一块内存空间的成员可以存储不同类型的数据。 联合体的定义方式与结构体类似,使用 union ,后跟联合体的名称。联

    2024年01月17日
    浏览(31)
  • c语言->自定义类型联合体和枚举类型

    文章目录 ✅作者简介:大家好,我是橘橙黄又青,一个想要与大家共同进步的男人😉😉 🍎个人主页:橘橙黄又青_C语言,函数,指针-CSDN博客 目的:学习联合体和枚举类型的声明联合体的特点和大小,枚举类型的有点和使用。 像结构体⼀样,联合体也是由⼀个或者多个成员构

    2024年02月05日
    浏览(25)
  • C语言——自定义类型详解[结构体][枚举][联合体]

    我打算把结构体、枚举、联合体的重点内容总结一下,方便后期复习的时候能够更快,更准确的去拾取遗忘的知识。也希望能给大家起到借鉴的作用,不足的地方,请多多包涵。(不足的地方,也希望大家能够指出来) 结构体是一些值的集合,这些集合称为成员变量,结构体

    2024年02月13日
    浏览(29)
  • 【C语言】自定义类型的详细讲解2(枚举类型、联合体类型)

    目录 1.枚举 1.1枚举优点 2.联合(共用体) 2.1联合体的应用 2.2联合体的存放 上一篇文章与大家分享并深度讨论研究了自定义类型中结构体和位段的内容,那么今天继续研究枚举和联合体的内容,希望对你有所帮助 枚举类型顾名思义就是一一列举。 把可能的取值一一列举出来

    2023年04月18日
    浏览(32)
  • C语言中的“三体”大佬们知道是什么吗? —— 结构体、枚举、联合体

    目录 前言 结构体 基本概念 结构体类型的声明 结构的声明 特殊的声明 结构的自引用 结构体变量的定义和初始化 结构体的对齐规则: 为什么要内存对齐 修改默认对齐数 修改默认对齐数的预处理命令 实际例子 结构体传参 结构体实现位段(位段的填充) 位段 什么是位段 位

    2024年02月12日
    浏览(31)
  • 探索C语言中的联合体与枚举:数据多面手的完美组合!

    ​ ✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:C语言学习 贝蒂的主页:Betty‘s blog 联合体 又叫 共用体 ,它是一种特殊的数据类型,允许您在 相同的内存位置存储不同的数据类型 。给联合体其中⼀个成员赋值,其他成员的值也跟着变

    2024年02月19日
    浏览(29)
  • 一篇博客学会系列(2)—— C语言中的自定义类型 :结构体、位段、枚举、联合体

    目录  前言 1、结构体 1.1、结构体类型的声明 1.2、特殊的结构体类型声明 1.3、结构体的自引用 1.4、结构体的定义和初始化 1.5、结构体成员变量的调用 1.6、结构体内存对齐  1.6.1、offsetof 1.6.2、结构体大小的计算 1.6.3、为什么存在内存对齐?  1.7、 修改默认对齐数 1.8、结构

    2024年02月08日
    浏览(31)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包