【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));

📝全篇总结

✅ 归纳:

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

  位段的内存分配

  位段的跨平台问题

  枚举类型的定义

  枚举的优点

  联合大小的计算

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

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

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

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

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

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

目录
相关文章
|
25天前
|
机器学习/深度学习 C语言
【c语言】一篇文章搞懂函数递归
本文详细介绍了函数递归的概念、思想及其限制条件,并通过求阶乘、打印整数每一位和求斐波那契数等实例,展示了递归的应用。递归的核心在于将大问题分解为小问题,但需注意递归可能导致效率低下和栈溢出的问题。文章最后总结了递归的优缺点,提醒读者在实际编程中合理使用递归。
53 7
|
1月前
|
存储 编译器 C语言
c语言回顾-联合和枚举
c语言回顾-联合和枚举
28 4
|
1月前
|
存储 C语言 C++
深入C语言,发现多样的数据之枚举和联合体
深入C语言,发现多样的数据之枚举和联合体
深入C语言,发现多样的数据之枚举和联合体
|
1月前
|
存储 机器学习/深度学习 编译器
一篇文章,把你的C语言拉满绩点
一篇文章,把你的C语言拉满绩点
12 0
|
2月前
|
存储 C语言
【C语言基础】一篇文章搞懂指针的基本使用
本文介绍了指针的概念及其在编程中的应用。指针本质上是内存地址,通过指针变量存储并间接访问内存中的值。定义指针变量的基本格式为 `基类型 *指针变量名`。取地址操作符`&`用于获取变量地址,取值操作符`*`用于获取地址对应的数据。指针的应用场景包括传递变量地址以实现在函数间修改值,以及通过对指针进行偏移来访问数组元素等。此外,还介绍了如何使用`malloc`动态申请堆内存,并需手动释放。
|
1月前
|
存储 安全 编译器
深入理解C语言中的枚举
深入理解C语言中的枚举
|
1月前
|
存储 编译器 C语言
【C语言】自定义类型:联合与枚举的简明概述
【C语言】自定义类型:联合与枚举的简明概述
|
3月前
|
存储 程序员 C语言
揭秘C语言:这些核心知识你掌握了吗?一篇文章带你突破编程基础,开启高效编码之旅!
【8月更文挑战第22天】C语言作为编程基石,以简洁高效著称,历经数十年仍备受欢迎。本文通过梳理C语言的核心概念,帮助读者深入理解并提升技能。适合各水平读者。基础语法从`main`函数开始,如示例中的“Hello, World!”程序所示。C语言强调头文件包含与语句结尾的分号。变量和数据类型丰富多样,如`int`、`float`、`char`等,合理选择可优化内存使用和性能。指针用于间接访问内存,是C语言的关键特性。控制结构如循环和分支使程序逻辑更灵活。函数支持代码复用与模块化。深入学习还需掌握预处理指令、文件操作等高级特性。通过系统学习与实践,你将能更熟练地使用C语言,构建高效稳定的应用。
61 4
|
3月前
|
存储 编译器 C语言
【C语言篇】自定义类型:联合体和枚举详细介绍
像结构体⼀样,联合体也是由⼀个或者多个成员构成,这些成员可以不同的类型。
45 1
|
3月前
|
C语言
【C初阶——指针5】鹏哥C语言系列文章,基本语法知识全面讲解——指针(5)
【C初阶——指针5】鹏哥C语言系列文章,基本语法知识全面讲解——指针(5)