C语言结构体和共用体

1.结构体变量的内存分配(结构体的大小)

struct node{char a;int b;char c;
};

(1)结构体的各成员变量的内存布局问题
a.以定义时各成员变量出现的次序,依次保存。
b.结构体的大小需要地址对齐(结构体中每个成员变量在内存中的存放位置需要对齐)
(2)为何需要地址对齐
平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常
性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。
总体来说:结构体的内存对齐是拿空间来换取时间的做法。目的是提高CPU访问内存数据的效率。

(3)地址对齐总结:
1、结构体定义的时候,变量成员的顺序会影响结构体的大小
2、对齐:成员变量以什么样的方式排列;紧密排列、还是松散中间是不是有间隔
3、结构体中地址对齐的字节数 按 最大个成员的基本数据类型大小对齐
4、结构体的总大小为其对齐方式的整数倍
在这里插入图片描述
在这里插入图片描述

struct node{char a;
char aa;
int b;
char c;
};
struct node{char a;
double b;
char c;
};
struct node{char a;
double b;
char c[12];
};

在这里插入图片描述

struct n1{char a;int b;double c;
};
struct n2{char a[5];int b;char c;int d;
};
struct n3{int a;char b;int c;char d;
};
struct n4{char a;short b;char c;
};

在这里插入图片描述

2.共用体

1、概念
几个不同的变量共用同一段内存的结构,在C语言中,被称为"共用体"类型结构
在这里插入图片描述
2、定义共用体类型

union 共用体名
{成员类型1  成员名1;成员类型2  成员名2;...
};

比如:

union  A{char c[9];int n;double d;
};

3、特点
a.联合体中的所有成员共享一段内存的
b.联合体中的最大个数据成员的大小就是联合体的大小

4、大小端模式
1)概念
一个多字节存储单元的低地址存储数据的低有效位还是高有效位
2)为何会有大小端模式
以前不同的芯片公司在处理把寄存器的数据存放到内存中时,采用的方式不统一,才产生了大小端两种模式。

小端模式:低地址存放数据的低有效位
大端模式:低地址存放数据的高有效位

在这里插入图片描述
测试 当前主机 是 小端序 还是 大端序

#include<stdio.h>union data{int a;char b;
}; int main()
{union data myData;myData.a = 0x12345678;printf("%x\n",myData.b); //78 说明当前主机是小端序return 0;
}

在这里插入图片描述
3)实际应用场景
网络中两个不同端序的主机之间进行通信时,需要进行字节序转换

5、结构体与共用体的区别

  • 结构体变量所占内存长度是各成员占的内存长度之和,每个成员分别占有其自己的内存单元。共用体变量所占的内存长度等于最长的成员的长度。共用体的内存开销要小一点。
  • 在共用体所用的内存中已经写入了数据,当使用其它元素时上次使用的内容将被覆盖. 也就是说他使几个不同类型的变量共占一段内存(相互覆盖),每次只有一个能使用。结构体则不然, 每个成员都会有存储空间的,可以一起用.内部变量间是相互独立的

3.枚举

1、概念
枚举类型用于声明一组命令的常数,当一个变量有几种可能的取值时,可以将它定义为枚举类型。
2、格式
enum 枚举的名字{
常量名字1,
常量名字2,
常量名字3,
};

//设计一个枚举类型
enum CAR_MOVE{CAR_MOVE_UP = 1, //如果没有进行赋值默认从0开始   此时 CAR_MOVE_UP 就是一个常量标识符 1CAR_MOVE_DOWN,CAR_MOVE_LEFT,CAR_MOVE_RIGHT
};

注意:如果里面的变量没有赋值,则默认从0开始,然后往后面递增

3、访问
外界访问枚举类型的数据成员可以直接访问

//定义一个枚举类型的变量
enum color mycolor;
//赋值的时候直接访问
mycolor = RED;

4、作用
不管是使用宏来定义常量,还是使用枚举来定义常量,目的只有一个:增强程序的可读性。

#include<stdio.h>//设计一个枚举类型
enum CAR_MOVE{//枚举常量 CAR_MOVE_UP , //如果没有进行赋值默认从0开始   此时 CAR_MOVE_UP 就是一个常量标识符 1CAR_MOVE_DOWN,CAR_MOVE_LEFT, //2CAR_MOVE_RIGHT
};int main()
{//int mode = -1;//定义一个枚举变量enum CAR_MOVE  mode = CAR_MOVE_LEFT; //整型变量printf("%d size:%ld\n",CAR_MOVE_LEFT,sizeof(CAR_MOVE_LEFT));printf("mode size:%ld\n",sizeof(mode));switch(mode){case CAR_MOVE_UP://小车向上移动break;case CAR_MOVE_DOWN://小车向下移动break;case CAR_MOVE_LEFT://小车向左移动printf("CAR_MOVE_LEFT\n");break;              case CAR_MOVE_RIGHT://小车向左移动break;}return 0;
}

练习1:修改 游戏那道题 ,将 各个功能 的数字表示 写成 枚举常量

enum {E_MODULE_REGSTER = 1,//注册功能E_MODULE_LOGIN,//登录功能  E_MODULE_SET_ATTRIBUTE,//设置相关属性功能      //setUserAttributeE_MODULE_SHOW_INFO,//显示功能E_MODULE_EXIT,//退出功能
};enum{E_SET_ATTRIBUTE_CHANGE_PASSWD = 1,//设置相关属性功能--修改密码};

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

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

相关文章

什么是感音神经性耳聋?

什么是感音神经性耳聋&#xff1f; 感音神经性耳聋&#xff0c;是指耳蜗内的神经细胞以及耳蜗后的神经纤维出现病变所引起的听力下降。由于耳蜗内的毛细胞失去其功能&#xff0c;无法将声音转化为电能&#xff0c;称为感音性聋。耳蜗后的神经纤维的功能出现障碍&#xff0c;无…

东芝2SC2712晶体管:性能强劲、应用广泛的完美选择

今天我要介绍一款在低频和音频放大应用中备受青睐的晶体管——东芝2SC2712。它不仅性能卓越&#xff0c;而且用途广泛&#xff0c;我们一起来看看它的亮点。 性能与参数 高电压和电流处理能力&#xff1a; 东芝2SC2712晶体管拥有50V的高集电极-发射极电压 (VCEO)&#xff0c;…

前端项目打包部署

打包 vue-cli脚手架的前端项目&#xff0c;点击npm脚本中的第二条编译命令&#xff0c;即可将项目编译&#xff0c;生成一个dist的文件夹&#xff0c;里面存放的就是编译好的前端项目文件&#xff0c;没有脚手架就在终端敲击npm run build命令编译前端项目 部署 Nginx 介绍:…

L1306——中断有关

配置引脚外部中断。芯片上引出的所有GPIOA端口&#xff0c;都可以设置外部中断功能。本案例开启了中断&#xff0c;中断优先级为默认&#xff0c;中断的触发方式为上升沿触发&#xff08;按键按下后引脚被拉高为高电平&#xff0c;从低电平变为高电平的过程称为上升沿&#xff…

教你一招,告警恢复时如何拿到恢复时的值?

Prometheus 生态的原生做法&#xff0c;由于阈值是放在 promql 中的&#xff0c;恢复时的消息中难以拿到恢复时的值&#xff0c;夜莺 v7.0.0.beta10 版本开始&#xff0c;提供了一种较为简单的内置方式&#xff0c;解决这个问题。下面我们就来看一下如何实现这个能力。 升级方…

迅狐供应链云仓系统源码:一站式解决抖音云仓、门店管理与移动端商家管理问题

一、简介 迅狐供应链云仓系统源码是一个全面解决抖音云仓、门店管理和移动端商家管理问题的一站式解决方案。该系统提供了一系列专业的功能和工具&#xff0c;帮助商家实现高效的供应链管理、仓储管理以及店铺管理&#xff0c;同时提供了移动端的商家管理功能&#xff0c;使商…

APP单页分发源码下载安卓苹果自动识别apk描述文件免签自动安装

下载地址&#xff1a;APP单页分发源码下载安卓苹果自动识别apk描述文件免签自动安装

10.3 Go 同步与通信

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

Yapi代码执行 waf绕过实战记录

本文记录了2021年一次有趣的客户目标测试实战。这次经历颇为特别&#xff0c;因此我将其整理成笔记&#xff0c;并在此分享&#xff0c;希望对大家有所帮助。 事件起因 疫情在家办公&#xff0c;准备开始划水的一天&#xff0c;这时接到 boss 的电话说要做项目&#xff0c;老…

环艺转行AI产品经理,这一世我要选择朝阳赛道!

选建筑学初衷 在大一设计专业分流前&#xff0c;我的意向专业是产品与环艺&#xff0c;然后那个时候去学院各自试了一下课&#xff0c;感觉自己还是蛮喜欢“建房子”的&#xff0c;因为从零到一慢慢设计出自己喜欢的空间是一件很美好的事情&#xff0c;造物感与成就感非常强烈…

各类电机数学模型相关公式总结 —— 集成芯片驱动

0、背景技术概述 永磁直流电机&#xff08;PMDC&#xff09;、永磁同步电机&#xff08;PMSM&#xff09;、无刷直流电机&#xff08;BLDC&#xff09;以及混合式两相步进电机在小功率应用场景中多采用集成芯片驱动&#xff08;如二合一、三合一驱动芯片&#xff09;的原因主要…

FPGA - 全局时钟资源

全局时钟资源是指FPGA内部为实现系统时钟到达FPGA内部各 CLB、IOB&#xff0c;以及BSRAM&#xff08;Block Select RAM&#xff0c;选择性BRAM&#xff09;等基本逻辑单元的延时和抖动最小化&#xff0c;采用全铜层工艺设计和实现的专用缓冲与驱动结构。 由于全局时钟资源的布线…

水产养殖监测站的工作原理

TH-LSZ06水产养殖监测站是保障水产质量安全的重要设施&#xff0c;监测水产养殖环境&#xff1a;负责监测水产养殖基地的水质、底泥、养殖物质等&#xff0c;确保养殖环境的适宜性和安全性。通过对养殖环境的实时监测&#xff0c;可以及时发现和预警水产疾病和污染问题&#xf…

新书速览|Autodesk Inventor 2024入门与案例实战:视频教学版

《Autodesk Inventor 2024入门与案例实战&#xff1a;视频教学版》 本书内容 《Autodesk Inventor 2024入门与案例实战&#xff1a;视频教学版》以Autodesk Inventor 2024为平台&#xff0c;重点介绍Autodesk Inventor 2024中文版的各种操作方法及其在工程设计领域的应用。《Au…

pdf压缩文件怎么压缩最小,软件工具压缩清晰

PDF格式的文件&#xff0c;当其体积过于庞大时&#xff0c;确实在上传的过程中显得尤为不便。今天给大家分享一个压缩pdf的简单的方法&#xff0c;让大家可以轻松的压缩pdf。 浏览器打开 "轻云处理pdf官网" &#xff0c;上传pdf文件&#xff0c;文件上传完成后网站会…

Spring Boot整合Redis通过Zset数据类型+定时任务实现延迟队列

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

10倍加速!揭秘IDM下载器的惊人秘密!

在数字化时代的浪潮下&#xff0c;互联网下载工具的多样性使得用户在选择时往往感到迷茫。其中&#xff0c;Internet Download Manager&#xff08;IDM&#xff09;作为一款高效的下载管理工具&#xff0c;因其加速下载、支持多线程下载和恢复中断下载等功能而受到广泛关注。然…

中仕公考:博士考公务员能免笔试吗?

博士学历的考生&#xff0c;无论是选择报考公务员还是事业单位&#xff0c;都必须经过正规的选拔过程。根据当前规定&#xff0c;所有体制内职位均须通过相应的考试方可入职&#xff0c;除非考生在高考时已选定定向招聘岗位。 博士毕业生如果想成为公务员&#xff0c;必须参加…

【原创教程】三菱Q与MERLIN II LS激光打标机控制说明

一、控制流程说明 1.硬件连接→2.软件通讯连接→3.编写远程控制PLC程序→4.编写通讯命令。 二、硬件连接1.用RJ45口普通网线将PLC和打标机连接。 三、软件通讯连接 1.打标机侧工控机-更改操作权限-点击菜单栏Setup,在下拉菜单中,点击Level,在下一级菜单点击Supervisor(左下…

俄语演讲开场白,柯桥外贸俄语培训

1、&#xff08;Разрешите мне&#xff09;от имени... 请允许我代表... 例&#xff1a; Разрешите мне от имени нашей компании поприветствовать всех членов вашей делегации…