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.mzph.cn/news/203247.shtml

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

相关文章

10-tornado项目部署

1. python3的安装和配置 1.1 安装系统依赖包 sudo dnf install wget yum-utils make gcc openssl-devel bzip2-devel libffi-devel zlib-devel -y1.2 下载Python wget https://www.python.org/ftp/python/3.9.5/Python-3.9.5.tgz1.3 解压 tar xzf Python-3.9.5.tgz 1.4 安装…

HarmonyOS4.0从零开始的开发教程04 初识ArkTS开发语言(下)

HarmonyOS&#xff08;二&#xff09; 初识ArkTS开发语言&#xff08;下&#xff09;之TypeScript入门 声明式UI基本概念 应用界面是由一个个页面组成&#xff0c;ArkTS是由ArkUI框架提供&#xff0c;用于以声明式开发范式开发界面的语言。 声明式UI构建页面的过程&#xff…

C练习题13

单项选择题(本大题共20小题,每小题2分,共40分。在每小题给出的四个备选项中,选出一个正确的答案,并将所选项前的字母填写在答题纸的相应位置上。) 1.结构化程序由三种基本结构组成、三种基本结构组成的算法是() A.可以完成任何复杂的任务 B. 只能完成部分复杂的任务 C. 只能完…

绘图 Seaborn 10个示例

绘图 Seaborn 是什么安装使用显示中文及负号散点图箱线图小提琴图堆叠柱状图分面绘图分类散点图热力图成对关系图线图直方图 是什么 Seaborn 是一个Python数据可视化库&#xff0c;它基于Matplotlib。Seaborn提供了高级的绘图接口&#xff0c;可以用来绘制各种统计图形&#xf…

Baumer工业相机堡盟工业相机如何通过BGAPISDK将相机图像高速保存到电脑内存(C#)

Baumer工业相机堡盟工业相机如何通过BGAPISDK将相机图像高速保存到电脑内存&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机图像保存到电脑内存的技术背景代码分析注册SDK回调函数BufferEvent声明可以存储相机图像的内存序列和名称在图像回调函数中将图像保存在内存序…

华为配置流量抑制示例

如拓扑图所示&#xff0c;SwitchA作为二层网络到三层路由器的衔接点&#xff0c;需要限制二层网络转发的广播、未知组播和未知单播报文&#xff0c;防止产生广播风暴&#xff0c;同时限制二三层网络转发的已知组播和已知单播报文&#xff0c;防止大流量冲击。 配置思路 用如下…

利用STM32内置Bootloader实现USB DFU固件升级

本文将介绍如何利用STM32内置的Bootloader来实现USB DFU&#xff08;Device Firmware Upgrade&#xff09;固件升级功能。首先&#xff0c;我们会介绍USB DFU的原理和工作流程。然后&#xff0c;我们将详细讲解如何配置STM32芯片以支持USB DFU&#xff0c;并提供相应的代码示例…

MySQL授权密码

mysql> crate databases school charcter set utf8; Query OK, 1 row affected, 1 warning (0.00 sec) 2.在school数据库中创建Student和Score表 mysql> use school Database changed mysql> create table student-> -> (id int(10) primary key auto_incremen…

介绍几个有意思的 GitHub 仓库

大家好&#xff0c;我是风筝。 今天介绍几个很有意思的 github 开源项目&#xff0c;看过之后就会发现&#xff0c;github 果然深意暗藏。 GitHub对于程序员来说&#xff0c;再熟悉不过了&#xff0c;绝大多数时候&#xff0c;我们到上面都是为了学习高质量的源代码&#xff…

深信服技术认证“SCSA-S”划重点:XSS漏洞

为帮助大家更加系统化地学习网络安全知识&#xff0c;以及更高效地通过深信服安全服务认证工程师考核&#xff0c;深信服特别推出“SCSA-S认证备考秘笈”共十期内容&#xff0c;“考试重点”内容框架&#xff0c;帮助大家快速get重点知识~ 划重点来啦 *点击图片放大展示 深信服…

Python实现FA萤火虫优化算法优化XGBoost分类模型(XGBClassifier算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 萤火虫算法&#xff08;Fire-fly algorithm&#xff0c;FA&#xff09;由剑桥大学Yang于2009年提出 , …

docker 的初步认识,安装,基本操作

docker相关知识 docker的相关概念 docker是一个开源的应用容器引擎&#xff0c;基于go语言开发并遵循了apache2.0协议开源。 docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中&#xff0c;然后发布到任何流行的linux服务器&#xff0c;也可以实现虚拟…

初级数据结构(二)——链表

文中代码源文件已上传&#xff1a;数据结构源码 <-上一篇 初级数据结构&#xff08;一&#xff09;——顺序表 | NULL 下一篇-> 1、链表特征 与顺序表数据连续存放不同&#xff0c;链表中每个数据是分开存放的&#xff0c;而且存放的位置尤其零散&#…

Django回顾 - 6 Ajax

【1】Ajax 定义&#xff1a; 异步Javscript和XML 作用&#xff1a; Javascript语言与服务器(django)进行异步交互&#xff0c;传输的数据为XML&#xff08;当然&#xff0c;传输的数据不只是XML,现在更多使用json数据&#xff09; 同步交互和异步交互&#xff1a; 1、同步交互&…

如何解决syntaxerror: more than 255 arguments 报错

如何解决syntaxerror: more than 255 arguments 报错 问题背景解释解决方案 问题背景 今天拼接特征的时候&#xff0c;突然代码报错syntaxerror: more than 255 arguments &#xff0c;看了一下感觉这个报错非常有意思&#xff0c;估计平时也是没机会碰到&#xff0c;和大家分…

用Mnesia为cache增加分布式支持

一&#xff1a;分布式缓存 1.选取通信策略 在设计分布式程序时&#xff0c;可供选择的通信方式主要有两种&#xff1a;异步通信和同步通信。采用异步通信时&#xff0c;发送方无须等待任何确认或应答。而在采用同步通信时&#xff0c;发送方会处于挂起状态&#xff0c;直至收…

Stable Diffusion AI绘画系列【17】:绘本童话风格场景

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

【南京站-EI会议征稿中】第三届网络安全、人工智能与数字经济国际学术会议(CSAIDE 2024)

第三届网络安全、人工智能与数字经济国际学术会议&#xff08;CSAIDE 2024&#xff09; 2024 3rd International Conference on Cyber Security, Artificial Intelligence and Digital Economy 第三届网络安全、人工智能与数字经济国际学术会议&#xff08;CSAIDE 2024&…

制作蓝牙小车

制作控制蓝牙小车app 想制作一个蓝牙小车&#xff0c;通过手机app程序操控小车运行&#xff0c;制作分三个部分&#xff08;app制作&#xff0c;蓝牙小车硬件制作&#xff0c;小车程序制作&#xff09;&#xff0c;先完成第一个部分app制作&#xff0c;本次app是通过androidstu…

MongoDB知识总结

这里写自定义目录标题 MongoDB基本介绍MongoDB基本操作数据库相关集合相关增删改查 MongoDB基本介绍 简单介绍 MongoDB是一个基于分布式文件存储的数据库。由C语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。 MongoDB是一个介于关系数据库和非关系数据库之间的产…