【C语言进阶篇】一篇文章让你彻底拿下 位段 枚举 联合!(下)

简介: 【C语言进阶篇】一篇文章让你彻底拿下 位段 枚举 联合!(下)
  1. int 位段被当成有符号数还是无符号数是不确定的。
  • 这就是说关于我们整形的最后一位,当成有符号数还是无符号数C语言没有规定!
  1. 位段中最大位的数目不能确定。(16位机器最大16,32位机器最大32,写成27,在16位机
    器会出问题。
  • int 类型在我们的早期是 2个字节的,因为早期的机器位最大为16。
  • 所以我们按现在int的大小4 个字节 写成27位的话再小机器上就会有问题
  1. 位段中的成员在内存中从左向右分配,还是从右向左分配标准尚未定义。
  • 刚刚我们在给大家模拟了,位段的存储但是这只是vs 里面的情况
  • 在linux gcc 编译器又是另一种情况了!这也是位段的跨平台问题
  • 🔥 注:在vs里面内存使用是从右往左,但是我们开辟空间是从地地址向高地址开辟!
  1. 当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余的位时,是
    舍弃剩余的位还是利用,这是不确定的。
  • 这也是和第三种一样的情况充满了不确定性,C语言没有明确规定

💬 什么是枚举

枚举顾名思义就是一一列举。
把可能的取值一一列举。
比如我们现实生活中:

一周的星期一到星期日是有限的7天,可以一一列举。

性别有:男、女、保密,也可以一一列举。

月份有12个月,也可以一一列举

这里就可以使用枚举了。

💭 枚举类型的定义

⛳️ 那么我们怎么定义枚举类型呢?其实和结构体差不多

  • 枚举类型的关键字是 enum
  • 那么我们来假设定义一下三元色 (红,绿色,黑色)

📚 代码演示:

enum Color//颜色
{
   RED,
   GREEN,
   BLUE
};
  1. { }中的内容是枚举类型的可能取值,也叫 枚举常量 。
  2. 这些可能取值都是有值的,默认从0开始,依次递增1,当然在声明枚举类型的时候也可以赋初值。

📚 代码演示:

#include <stdio.h>
enum Color//颜色
{
  RED = 1,
  GREEN = 9,
  BLUE = 4
};
int main()
{
  printf("%d", RED);
  printf("%d", GREEN);
  printf("%d", BLUE );
  return 0;
}

📑 代码结果:

💻 枚举的优点

我们可以使用 #define 定义常量,为什么非要使用枚举?

📜枚举的优点:

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

⛳️ #define 定义的标识符比较枚举有类型检查,更加严谨。

  • 枚举是个类型,所以我们在使用的时候就要注意了
  • 一旦定义的是个枚举类型,就只能给他赋枚举类型的变量成员
    🔥 注:在C语言里面类型检查不是很严谨所以我们用C++程序测试的。

💭 枚举的使用

📚 代码演示:

#include <stdio.h>
enum Color//颜色
{
  RED = 1,
  GREEN = 2,
  BLUE = 4
};
int main()
{
  enum Color clr = GREEN;//只能拿枚举常量给枚举变量赋值
  return 0;
}

💬 联合(共用体)

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

⛳️这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间(所以联合也叫共用体)。

  • 他的关键字是 union

💭 联合类型的定义

⛳️ 那么我们如何定义联合体呢?下面就来看一下假如来定义一个un 联合体

📚 代码演示:

#include <stdio.h>
union un
{
  char c;
  int i;
};
int main()
{
  printf("%d", sizeof(un));
  return 0;
}

📑 代码结果:

啊!这里就有许多铁汁们要问了,一个 int 一个 char 怎么也得5个字节,而这里才用了4个字节!

  • 而这就是联合体的特点了,这些成员公用同一块空间(所以联合也叫共用体)

💻 联合的特点

  ⛳️联合的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小(因为联合至少得有能力保存最大的那个成员)。

  • 我们把每个成员的地址打印出来就可以看到他们的确是用一块地址的!
  • 所以公用体同一时间只能用一个

📑图片展示:

举个例子:

#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));
  //下面输出的结果是什么?
  un.i = 0x11223344;
  un.c = 0x55;
  printf("%x\n", un.i);
  return 0;
}

有人就会问了,既然我们是公用一块内存的那么先把 i 里面放满内容。然后 使用 c 变量 i 会改变嘛?

  • 我们来大致画一下内存分布图来运行检测一下

📑 代码结果:

哦~!看来的确是像我们前面画的那样存储的!

💭 联合大小的计算

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

🔰 是不是非常简单,下面我们就留俩个例题给大家练习练习!

union Un1
{
 char c[5];
 int i;
};
union Un2
{
 short c[7];
 int i;
};
//下面输出的结果是什么?
printf("%d\n", sizeof(union Un1));
printf("%d\n", sizeof(union Un2));

📝全篇总结

✅ 归纳:

好了以上就是关于 位段枚举联合 就全部讲解完毕啦!

  位段的内存分配

  位段的跨平台问题

  枚举类型的定义

  枚举的优点

  联合大小的计算

☁️ 好了把这些知识点全部掌握就可以彻底搞懂, 位段枚举联合 啦!快去试试吧

看到这里了还不给博主扣个:
⛳️ 点赞☀️收藏 ⭐️ 关注

💛 💙 💜 ❤️ 💚💓 💗 💕 💞 💘 💖

拜托拜托这个真的很重要!

你们的点赞就是博主更新最大的动力!

有问题可以评论或者私信呢秒回哦。

目录
相关文章
|
1天前
|
存储 编译器 程序员
C语言:自定义类型 - 结构体 & 联合体 & 枚举
C语言:自定义类型 - 结构体 & 联合体 & 枚举
12 2
|
1天前
|
C语言
以c语言为基础实现的简易扫雷游戏(游戏代码附在文章最后,如有需要请自取)
以c语言为基础实现的简易扫雷游戏(游戏代码附在文章最后,如有需要请自取)
48 1
|
1天前
|
存储 C语言
C语言 — 指针进阶篇(下)
C语言 — 指针进阶篇(下)
20 0
|
1天前
|
存储 C语言 C++
C语言 — 指针进阶篇(上)
C语言 — 指针进阶篇(上)
29 0
|
1天前
|
存储 安全 网络协议
自定义类型-结构体,联合体和枚举-C语言
自定义类型-结构体,联合体和枚举-C语言
|
1天前
|
存储 编译器 C语言
【C语言期末不挂科——指针进阶篇】【上】
【C语言期末不挂科——指针进阶篇】【上】
|
1天前
|
存储 搜索推荐 编译器
【C语言】一篇文章深入解析联合体和枚举且和结构体的区别
【C语言】一篇文章深入解析联合体和枚举且和结构体的区别
|
1天前
|
编译器 C语言 C++
C语言第三十二弹---自定义类型:联合和枚举
C语言第三十二弹---自定义类型:联合和枚举
|
1天前
|
存储 开发框架 .NET
【C语言进阶】自定义类型详解(结构体、枚举、联合)
【C语言进阶】自定义类型详解(结构体、枚举、联合)

热门文章

最新文章