C语言之联合和枚举

C语言之联合和枚举

文章目录

  • C语言之联合和枚举
    • 1. 联合体
      • 1.1 联合体的声明
      • 1.2 联合体的特点
      • 1.3 结构体和联合体对比
      • 1.4 联合体大小的计算
      • 1.5 联合体小练习
    • 2. 枚举
      • 2.1 枚举类型的声明
      • 2.2 枚举类型的优点
      • 2.3 枚举类型的使用

1. 联合体

1.1 联合体的声明

像结构体⼀样,联合体也是由⼀个或者多个成员构成,这些成员可以不同的类型。
但是编译器只为最⼤的成员分配⾜够的内存空间。联合体的特点是所有成员共⽤同⼀块内存空间。所以联合体也叫:共⽤体
给联合体其中⼀个成员赋值,其他成员的值也跟着变化

1.2 联合体的特点

代码一:

#include <stdio.h>union U
{char a;int b;
};
int main()
{union U uu = { 0 };printf("%zd\n", sizeof(uu));return 0;
}

代码运行结果:>
4

结论:联合的成员是公用一块空间的,联合体变量的大小至少是最大成员的大小(至少确保能存下最大的那个成员)

代码二:

#include <stdio.h>union U
{char a;int b;
};
int main()
{union U uu = { 0 };printf("%p\n", &(uu.a));printf("%p\n", &(uu.b));printf("%p\n", &uu);return 0;
}

代码运行结果:>
012FFD90
012FFD90
012FFD90

可以看到无论是联合体的地址还是联合体成员的地址都是一样的,说明他们共用同一块空间

代码三:

#include <stdio.h>union U
{char a;int b;
};
int main()
{union U uu = { 0 };uu.b = 0x11223344;uu.a = 0x55;printf("%#x\n", uu.b);return 0;
}

%#x打印的是带0x的十六进制数,0x11223344是一个十六进制数

代码运行结果:>
0x11223355

在这里插入图片描述
由于是小端字节序存储,优先存低字节的也就是44,然后通过char修改了第一个字节的内容,将44修改成了55,所以打印结果为0x11223355

1.3 结构体和联合体对比

union U
{char a;int b;
};
struct S
{char a;int b;
};

在这里插入图片描述
相对于结构体,联合体较节省空间

1.4 联合体大小的计算

  1. • 联合体大小至少是联合体中最大成员的大小
  2. • 当最大成员的大小不是最大对齐数的整数倍时,就要对齐到最大对齐数的整数倍,和结构体一样,联合体也是有对齐的
#include <stdio.h>union U1
{char a[7];int b;
};
union U2
{short a[7];int b;
};
int main()
{union U1 u = { 0 };union U2 uu = { 0 };printf("%zd\n", sizeof(u));printf("%zd\n", sizeof(uu));return 0;
}

代码运行结果如下:>
8
16

联合体U1中有两个成员,char a[7] int b 其中最大成员为char a[7],为7个字节,char为1字节,默认对齐数为8,取较小值1,int为4字节,默认对齐数为8,取较小值4,所以两个成员中的最大对齐数为4,最大成员的大小为7,不是最大对齐数4的倍数,所以将对齐至8字节,对齐之后才是联合体的大小

同理联合体U2,也有两个成员,最大成员的大小为14字节,不是最大对齐数4的倍数,所以将对齐至16字节,对齐之后才是联合体的大小

1.5 联合体小练习

要求:写一个代码,判断当前机器的字节序

代码一:

#include <stdio.h>int check_sys()
{int n = 1;return *(char*)&n;
}
int main()
{int ret = check_sys();if (ret == 1)printf("小端\n");elseprintf("大端\n");return 0;
}

小端字节序,将低字节内容存到低地址,高字节内容存到高地址
大端字节序,将高字节内容存到低地址,低字节内容存到高地址
内存使用优先使用低地址

1的十六进制为00 00 00 01
小端字节序为 01 00 00 00
大端字节序为 00 00 00 01

取出1的地址,将其从int*类型的指针强制类型转化为char*类型的地址,这样解引用的时候就会访问低地址处的内容,如果解引用得到1则是小端,得到0则为大端

代码二:
使用联合体的方式

#include <stdio.h>int check_sys()
{union{char a;int b;}un;un.b = 1;return un.a;
}
int main()
{int ret = check_sys();if (ret == 1)printf("小端\n");elseprintf("大端\n");return 0;
}

通过联合体公用同一块空间的方式,如果第一个字节中存的是1则是小端,如果存的是0则是大端

2. 枚举

2.1 枚举类型的声明

枚举顾名思义就是一一列举

enum Day//星期
{Mon,Tues,Wed,Thur,Fri,Sat,Sun
};

枚举类型:enum Day
枚举常量:Mon,Thus,… //枚举常量使用逗号隔开,最后一个常量不需要

枚举常量是有值的,第一个常量的值默认从0开始,依次递增1,也可以在声明的时候为枚举常量赋值

enum Color
{RED = 4,YELLOW = 8,BLUE = 12
};

2.2 枚举类型的优点

#define关键字为什么还要使用枚举呢

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

2.3 枚举类型的使用

#include <stdio.h>enum Color
{RED = 4,YELLOW = 8,BLUE = 12
};int main()
{enum Color clr = BLUE;//使用枚举常量为变量赋值return 0;
}
#include <stdio.h>enum Color
{RED = 4,YELLOW = 8,BLUE = 12
};int main()
{enum Color clr = 12;//使用整数为变量赋值,12 == BLUEreturn 0;
}

在C语言中,对其规定不是很严格,在C++中,C++的类型检查比较严格,这是个语法错误,无法使用整型对枚举变量赋值

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/211708.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

苹果OS X系统介绍(Mac OS --> Mac OS X --> OS X --> macOS)

文章目录 OS X系统介绍历史与版本架构内核与低级系统图形&#xff0c;媒体和用户界面应用程序和服务 特性用户友好强大的命令行安全性集成与互操作性 总结 OS X系统介绍 OS X是由苹果公司为Macintosh计算机系列设计的基于UNIX的操作系统。其界面友好&#xff0c;易于使用&…

CleanMyMac x4.15软件应用程序永久使用

许多刚从Windows系统转向Mac系统怀抱的用户&#xff0c;一开始难免不习惯&#xff0c;因为Mac系统没有像Windows一样的C盘、D盘&#xff0c;分盘分区明显。因此这也带来了一些问题&#xff0c;关于Mac的磁盘的清理问题&#xff0c;怎么进行清理&#xff1f;怎么确保清理的干净&…

Linux系统调试课:网络性能工具总结

文章目录 一、网络性能指标二、netstat三、route四、iptables沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇章一起了解下网络性能工具。 一、网络性能指标 从网络性能指标出发,你更容易把性能工具同系统工作原理关联起来,对性能问题有宏观的认识和把握。这样,…

学习记录---Kubernetes的资源指标管道-metrics api的安装部署

一、简介 Metrics API&#xff0c;为我们的k8s集群提供了一组基本的指标(资源的cpu和内存)&#xff0c;我们可以通过metrics api来对我们的pod开展HPA和VPA操作(主要通过在pod中对cpu和内存的限制实现动态扩展)&#xff0c;也可以通过kubectl top的方式&#xff0c;获取k8s中n…

MySQL系列(二)——日志篇

一、有哪些日志 MySQL应该是我们用的最多&#xff0c;也算是最熟悉的数据库了。那么&#xff0c;MySQL中有哪些日志了&#xff0c;或者你知道的有哪些日志了&#xff1f; 首先&#xff0c;我们能接触到的&#xff0c;一般我们排查慢查询时&#xff0c;会去看慢查询日志。如果…

UniApp H5 跨域代理配置并使用(配置manifest.json、vue.config.js)

UniApp 运行到浏览器的时候&#xff0c;接口会跨域报错&#xff0c;这里通过两种方式解决&#xff0c;第一&#xff1a;修改Uniapp自带的manifest.json 源码视图并进行配置h5设置。第二&#xff1a;在项目根目录新建vue.config.js并配置代理。 二选一即可。 修改或调整配置文件…

智能优化算法应用:基于人工大猩猩部队算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于人工大猩猩部队算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于人工大猩猩部队算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.人工大猩猩部队算法4.实验参数设…

弱网模拟工具

一、背景 一个人晚上在家通过 Wi-Fi 上网&#xff0c;在线电影播放基本流畅&#xff0c;可一旦在晚间用网高峰期打视频电话就画面糊&#xff0c;这时不仅可能带宽受限了&#xff0c;还可能有较高的丢包率。与有线网络通信相比&#xff0c;无线网络通信受环境影响会更大&#x…

svn合并冲突时每个选项的含义

合并冲突时每个选项的含义 - 这个图片是 TortoiseSVN&#xff08;一个Subversion&#xff08;SVN&#xff09;客户端&#xff09;的合并冲突解决对话框。当你尝试合并两个版本的文件并且出现差异时&#xff0c;你需要解决这些差异。这个对话框提供了几个选项来处理合并冲突&…

AI助力智慧农业,基于YOLOv7【tiny/yolov7/yolov7x】开发构建不同参数量级农田场景下庄稼作物、杂草智能检测识别系统

智慧农业随着数字化信息化浪潮的演变有了新的定义&#xff0c;在前面的系列博文中&#xff0c;我们从一些现实世界里面的所见所想所感进行了很多对应的实践&#xff0c;感兴趣的话可以自行移步阅读即可&#xff1a; 《自建数据集&#xff0c;基于YOLOv7开发构建农田场景下杂草…

C++ IO库

IO类 IO对象不能拷贝和赋值 iostream 表示形式的变化&#xff1a; 将100转换成二进制序列 然后格式化输出 x,y共用一块内存 输出的时候用不同的方式解析同一块内存 操作 格式化&#xff1a;内部表示转换为相应字节序列 缓存&#xff1a;要输出的内容放到缓存 编码转换&…

持续集成交付CICD:Sonarqube自动更新项目质量配置

目录 一、实验 1.Sonarqube手动自定义质量规则并指定项目 2.Sonarqube自动更新项目质量配置 一、实验 1.Sonarqube手动自定义质量规则并指定项目 &#xff08;1&#xff09;自定义质量规则 ①新配置 ②更多激活规则③根据需求激活相应规则④已新增配置 ⑤ 查看 &#x…

2023_Spark_实验二十七:Linux中Crontab(定时任务)命令详解及使用教程

Crontab介绍&#xff1a; Linux crontab是用来crontab命令常见于Unix和类Unix的操作系统之中&#xff0c;用于设置周期性被执行的指令。该命令从标准输入设备读取指令&#xff0c;并将其存放于“crontab”文件中&#xff0c;以供之后读取和执行。该词来源于希腊语 chronos(χρ…

Redis key过期删除机制实现分析

文章目录 前言Redis key过期淘汰机制惰性删除机制定时扫描删除机制 前言 当我们创建Redis key时&#xff0c;可以通过expire命令指定key的过期时间(TTL)&#xff0c;当超过指定的TTL时间后&#xff0c;key将会失效。 那么当key失效后&#xff0c;Redis会立刻将其删除么&#…

敏捷:应对软件定义汽车时代的开发模式变革

随着软件定义汽车典型应用场景的落地&#xff0c;汽车从交通工具转向智能移动终端的趋势愈发明显。几十年前&#xff0c;一台好车的定义主要取决于高性能的底盘操稳与动力系统&#xff1b;几年前&#xff0c;一台好车的定义主要取决于智能化系统与智能交互能否满足终端用户的用…

LLM;超越记忆《第 2 部分 》

一、说明 在这篇博客中&#xff0c;我深入研究了将大型语言模型&#xff08;LLM&#xff09;提升到基本记忆之上的数学框架。我们探索了动态上下文学习、连续空间插值及其生成能力&#xff0c;揭示了 LLM 如何理解、适应和创新超越传统机器学习模型。 LLM代表了人工智能的重大飞…

Linux常用指令详解

目录 前言&#xff1a; Linux的目录结构 Linux常用指令简介 whoami指令 ls指令 pwd指令 cd指令 tree指令 touch指令 mkdir指令 rmdir指令与rm指令 man指令 cp&#xff08;copy&#xff09;指令 mv&#xff08;move&#xff09;指令 cat指令 重定向及重定向的类型…

Redis缓存问题

在实际的业务场景中&#xff0c;Redis 一般和其他数据库搭配使用&#xff0c;用来减轻后端数据库的压力&#xff0c;比如和关系型数据库 MySQL 配合使用。 Redis 会把 MySQL 中经常被查询的数据缓存起来&#xff0c;比如热点数据&#xff0c;这样当用户来访问的时候&#xff0c…

12月8日Workshop预告|理解Sui上对象所有权转移

在本workshop中&#xff0c;我们将介绍一些Sui上对象所有权转移&#xff08;transfer-to-object&#xff09;功能的示例&#xff0c;并讨论这个新功能在构建Sui上新的抽象化概念时的用途。 我们将通过几个示例来演示transfer-to-object功能。此外&#xff0c;我们将介绍如何使…

时间序列预测 — GRU实现多变量多步光伏预测(Tensorflow)

目录 1 数据处理 1.1 数据集简介 1.2 导入库文件 1.3 数据集处理 1.4 训练数据构造 2 模型训练与预测 2.1 模型训练 2.2 模型多步预测 2.3 预测可视化 1 数据处理 1.1 数据集简介 实验数据集采用数据集7&#xff1a;常州普利司通光伏数据集&#xff08;下载链接&…