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

📝全篇总结

✅ 归纳:

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

  位段的内存分配

  位段的跨平台问题

  枚举类型的定义

  枚举的优点

  联合大小的计算

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

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

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

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

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

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

目录
相关文章
|
10月前
|
C语言
【C语言程序设计——循环程序设计】枚举法换硬币(头歌实践教学平台习题)【合集】
本文档介绍了编程任务的详细内容,旨在运用枚举法求解硬币等额 - 循环控制语句(`for`、`while`)及跳转语句(`break`、`continue`)的使用。 - 循环嵌套语句的基本概念和应用,如双重`for`循环、`while`嵌套等。 3. **编程要求**:根据提示在指定区域内补充代码。 4. **测试说明**:平台将对编写的代码进行测试,并给出预期输出结果。 5. **通关代码**:提供完整的代码示例,帮助理解并完成任务。 6. **测试结果**:展示代码运行后的实际输出,验证正确性。 文档结构清晰,逐步引导读者掌握循环结构与嵌套的应用,最终实现硬币兑换的程序设计。
158 19
|
10月前
|
C语言
【C语言程序设计——枚举】得到 3 种不同颜色的球的可能取法(头歌实践教学平台习题)【合集】
本关任务要求从红、黄、蓝、白、黑五种颜色的球中,每次取出3个不同颜色的球,列举所有可能的排列情况。通过定义枚举类型和使用嵌套循环语句实现。枚举类型用于表示球的颜色,循环语句用于生成并输出所有符合条件的排列 编程要求:在指定区域内补充代码,确保输出格式正确且完整。测试说明:平台将验证代码输出是否与预期一致,包括每种排列的具体顺序和总数。 示例输出: ``` Output: 1 red yellow blue 2 red yellow white ... 60 black white blue total: 60 ```
222 4
|
机器学习/深度学习 C语言
【c语言】一篇文章搞懂函数递归
本文详细介绍了函数递归的概念、思想及其限制条件,并通过求阶乘、打印整数每一位和求斐波那契数等实例,展示了递归的应用。递归的核心在于将大问题分解为小问题,但需注意递归可能导致效率低下和栈溢出的问题。文章最后总结了递归的优缺点,提醒读者在实际编程中合理使用递归。
411 7
|
存储 编译器 C语言
c语言回顾-联合和枚举
c语言回顾-联合和枚举
147 4
|
存储 C语言 C++
深入C语言,发现多样的数据之枚举和联合体
深入C语言,发现多样的数据之枚举和联合体
139 0
深入C语言,发现多样的数据之枚举和联合体
|
存储 机器学习/深度学习 编译器
一篇文章,把你的C语言拉满绩点
一篇文章,把你的C语言拉满绩点
90 0
|
存储 安全 编译器
深入理解C语言中的枚举
深入理解C语言中的枚举
|
存储 编译器 C语言
【C语言】自定义类型:联合与枚举的简明概述
【C语言】自定义类型:联合与枚举的简明概述
137 0
|
2月前
|
存储 C语言
`scanf`是C语言中用于按格式读取标准输入的函数
`scanf`是C语言中用于按格式读取标准输入的函数,通过格式字符串解析输入并存入指定变量。需注意输入格式严格匹配,并建议检查返回值以确保读取成功,提升程序健壮性。
960 0