【C语言进阶篇】自定义类型:联合体和枚举

【C语言进阶篇】自定义结构体类型:联合体和枚举

🌈个人主页:开敲

🔥所属专栏:C语言

🌼文章目录🌼

1. 联合体

    1.1 联合体类型的声明

    1.2 联合体的特点

    1.3 联合体大小的计算

2. 枚举

    2.1 枚举类型的声明

    2.2 枚举类型的优点

    2.3 枚举类型的使用

1. 联合体
    1.1 联合体类型的声明

  与结构体类似,联合体也是由一个或者多个成员构成的,这些成员可以是不同的类型。唯一不同的是:编译器只为最大的成员开辟空间,联合体中剩余的成员共用这一块空间。因此,联合体也称为:共用体。

这里的大小为4,因为联合体内成员最大的就是 int 型,而剩余的 char c成员共用这块空间。

    1.2 联合体与结构体对比

  

                                                                   内存分配如下图:

    1.3 联合体大小的计算

①  联合体的大小至少是最大成员的大小。

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

    1.4 联合体的巧妙用法

  在之前的文章中,我们判断一个机器是大小端的方法是:创建一个整型变量赋值为1,用一个char* 的指针指向这个变量的第一个字节的地址,判断是 0 还是 1 从而判断是大端存储还是小端存储

  而在我们学习了联合体之后,就可以用一个非常巧妙的方法来判断机器的大小端:

  这里的 c 是跟 i 存放在同一个空间的,而 char 类型只占一个字节,因此,c 保存在了  i 内存的第一个字节处,相当于 c 指向了 i 的第一个字节地址,因此,可以通过判断 c 的值来判断机器的大小端模式。 

2. 枚举

  枚举——顾名思义,就是一一列举,把可能的取值一一列举,和穷举不同的是,穷举就算有再多,只要能列举完就会列举,而枚举并不会列举太多。

  生活中有许多枚举的例子,比如:

  一周的星期一到星期日可以一一列举;

  一年有十二个月份可以一一列举;

  ......

  当我们想要表示这些数据的时候,就可以使用枚举。

    2.1 枚举类型的声明

    

上面定义的 enum Dayenum Month 都是枚举类型,{}中的内容是枚举类型的可能取值,也叫枚举常量,这些常量都是默认有值的,从上至下从0依次递增:

enum Day//星期
{
	Mon,//0
	Tues,//1
	Wed,//2
	Thur,//3
	Fir,//4
	Sat,//5
	Sun//6
};


enum Month//月份
{
	Janu,//0
	Febr,//1
	Mar,//2
	Apr,//3
	May,//4
	June,//5
	July,//6
	Aug,//7
	Sep,//8
	Oct,//8
	Nove,//10
	Dec//11
};

  当然我们也可以在创建的时候赋初始值(这里需要注意的是,在C语言中可以对枚举常量赋值。但在C++中没法进行赋值操作,C++的类型检查更加严格,类型不相同无法进行赋值操作),当赋了初始值以后,剩余成员的默认值也会随之改变,比如:

    2.2 枚举类型的优点

    在我们之前的学习中,我们学习到了#define 来定义常量,既然#define 可以用来定义常量,为什么还要使用枚举呢?下面就是一些枚举的优点:

①  增加代码的可读性和可维护性

②  #define定义的常量没有类型,而枚举中的常量带有类型,因此在使用枚举时更加严谨

③  便于调试观察,#define定义的常量,在使用时会删除#define定义的符号,譬如:

 

④  使用方便,一次可定义多个常量:

⑤  枚举常量是遵守作用域规则的。,在函数内部声明的枚举只能在函数内部使用。

    2.3 枚举类型的使用  

                                                        创作不易,点个赞呗,谢谢啦~

         

  • 28
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值