自定义类型

目录

结构体

匿名结构体

结构体嵌套

结构体大小

设置默认对齐数

位段

位段的跨平台问题

Enum枚举

枚举的好处

union联合体

 判断大小端

内存大小


结构体

前面我们讲了结构体的基本知识,还有一些知识并没有罗列完全,这篇将结构体剩余的一些小知识铺垫出来。

匿名结构体

struct
{char book_name[20];char author[20];int price;char id[15];
}sb1, sb2;//匿名结构体类型

像这样的结构体称为匿名结构体,注意匿名结构体变量必须在结构体声明尾部创建。 

注意匿名结构体的生命周期只有声明这一行,且不同匿名结构体的类型都是不同的。

可以看到,即使内部有相同类型也无法被编译器识别,且脱离结构体定义匿名结构体也是非法的。 

结构体嵌套

结构体里能否嵌套一个结构体呢?答案是可以的,不过要注意不能自己嵌套自己。

struct Node
{int data;struct Node n;
};
sizeof(Node);//能否计算结构体大小呢?

正确做法是用一个指针去接收结构体的地址,这种结构就是我们数据结构中链表的结构。

struct Node
{int data;struct Node* next;
};


结构体大小

先来用sizeof计算不同结构体大小:

为什么类型相同的结构体大小不一样呢? 这里我们用到一个函数叫做offsetoff来计算结构体成员偏移量。

stddef.h 

 偏移规则:

  • 第一个成员对齐到起始位置为0的偏移处
  • 后续成员偏移量必须为某个对齐数的整数倍处。
  • 对齐数:自身大小与默认对齐数的较小值(vs默认对齐数为8
  • LInux下不设默认对齐数(结构体自身大小为对齐数
  • 结构体内存大小必须为最大对齐数的整数倍
  • 嵌套的结构体应对齐到自身最大对齐数的整数倍处,该结构体的最大对齐数也就是作为成员的一个对齐数

这种对齐方式使得在访问结构体时更加高效,是一种空间换时间的做法。我们创建结构体的时候也可以考虑按占用空间数将成员从小到大排列。

设置默认对齐数

 我们可以使用这条指令来修改默认对齐数

#pragma pack() 

#pragma pack(2)
struct S1 
{char c1;//2int i;//4char c2;//2
};//8struct S2
{char c1;//1char c2;//1int i;//4
};//6

位段

  • 位段——就是二进制位
  • 位段的成员可以是整形家族的任意成员(包括char)
  • 位段的空间按照int(4字节),char(1字节)开辟的(避免将int和char混用
  • 位段是不跨平台的,注意可移植性的程序应避免使用位段
struct A
{int _a : 2;int _b : 5;int _c : 10;int _d : 30;
};
struct B
{char _a : 3;char _b : 4;char _c : 5;char _d : 4;
};

 我们可以在结构体中用 :指定该数据所占的比特位,大大减少了对空间的利用。

位段的跨平台问题

1.int位段被当成有符号数或无符号数是不确定的。

2.当开辟的空间大于剩余空间(int or char)时,是利用还是舍去剩余空间是不确定的。

3.位段中空间(bit)是从左向右利用或从右向左利用是不确定的

4. 位段中最大位的数目不能确定。(16位机器最大16,32位机器最大32,写成27,在16位机 器会出问题。

Enum枚举

列举出可能的取值,这些可能取值为一个枚举常量默认从0开始,依次递增1

//声明枚举类型
enum color
{BLACK = 10,PINK,    //11BLUE,    //12YELLOW    //13
};
 enum color a = BLACK;//初始化枚举变量int num = BLACK;//可当作常量使用

枚举的好处

  • 增加代码的可读性和可维护性
  • 和#define定义的标识符比较枚举有类型检查,更加严谨。
  • 防止了命名污染(封装)
  • 便于调试
  • 使用方便,一次可以定义多个常量

union联合体

  联合体是一种特殊的自定义类型,它所包含的成员变量共用一块地址空间

 

 判断大小端

int check_sys()
{union location{char i;int n;}u;u.n = 1;//01000000return u.i;//01
}
int main()
{if(check_sys() == 1)printf("小端\n");elseprintf("大端\n");
}

内存大小

联合体的内存大小至少为最大成员变量所占空间大小,这点很好理解,共用一块空间必须满足最大成员变量的空间大小。除此之外,它也遵守结构体大小为成员中最大对齐数的整数倍的规则。

例: 

 

单个char所占1个字节,而int为4个字节,成员变量最大的是arr占5个字节,所以整个结构体的大小应为最大对齐数(int)的整数倍,也就是8。 

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

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

相关文章

Windows mysql 5.7 msi版、mysql 8.0 msi版下载、安装教程,附详细图文

大家好,今天为大家带来的是 mysql 5.7 msi , MySql 8.0 版本的下载、安装教程,附详细图文。本文以 5.7 版本为例子,帮助大家讲解。希望对大家有所帮助 文章首发地址 一、下载地址 这里提供一下 CSDN 镜像下载地址,有…

Spring5应用之事务属性

作者简介:☕️大家好,我是Aomsir,一个爱折腾的开发者! 个人主页:Aomsir_Spring5应用专栏,Netty应用专栏,RPC应用专栏-CSDN博客 当前专栏:Spring5应用专栏_Aomsir的博客-CSDN博客 文章目录 参考文献前言事务…

python sqlalchemy(ORM)- 01 简单使用

[doc] 简介 sqlalchemy 是python操作sql数据库的工具,是一个对象关系映射的框架;在python中提供高效、高性能的数据库访问,企业级的数据持久化模式;pypi 地址sqlalchemy官网 sqlalchemy架构 sql操作是独立于ORM操作的&#xf…

vscode 资源管理器移动到右边

目录 vscode 资源管理器移动到右边 vscode 资源管理器移动到右边 点击 文件》首选项》设置》工作台》外观》 找到这个配置下拉选择左右

单元测试很难么?也没有吧

前言 你可能会用单元测试框架,python的unittest、pytest,Java的Junit、testNG等。 那么你会做单元测试么!当然了,这有什么难的? test_demo.py def inc(x):return x 1def test_answer():assert inc(3) 4 inc() 是…

三次挥手和四次握手

TCP建立连接(三次握手) 经过DNS域名解析后,获取到了服务器的IP地址,在获取到IP地址后,便会开始建立一次连接,这是由TCP协议完成的,主要通过三次握手进行连接。 第一次握手: 建立连…

(部署服务器系列一)虚拟机模拟部署服务器

1、下载安装vmware 15 (win7最高支持版) 2、下载安装CentOS 配置2核2g(最少)磁盘100g(不会实际占有)选择时区-上海配置分区:https://blog.csdn.net/qq_35363507/article/details/127390889 &a…

设计模式02———建造者模式 c#

首先我们打开一个项目 在这个初始界面我们需要做一些准备工作 建基础通用包 创建一个Plane 重置后 缩放100倍 加一个颜色 更换天空盒(个人喜好) 任务:使用【UI】点击生成6种车零件组装不同类型车 【建造者模式】 首先资源商店下载车模型 将C…

虚幻引擎:如何才能对音波(声音资产)进行逻辑设置和操作

案列:调整背景音乐大小 1.创建一个SoundCue 2.进入创建的SoundCue文件 3. 创建音效类和音效类混合 4.进入SoundCue选择需要的音效类 5.然后音效类混合选择相同的音效类 6.然后蓝图中通过节点进行控制音量大小

把二叉搜索树转换为累加树

题目链接 把二叉搜索树转换为累加树 题目描述 注意点 树中的节点数介于 0 和 10000 之间每个节点的值介于 -10000 和 10000 之间树中的所有值 互不相同给定的树为二叉搜索树 解答思路 因为二叉搜索树的性质是左子树的值始终小于根节点的值,右子树的值始终大于根…

Android组件通信——ActivityGroup(二十五)

1. ActivityGroup 1.1 知识点 (1)了解ActivityGroup的作用; (2)使用ActivityGroup进行复杂标签菜单的实现; (3)使用PopupWindow组件实现弹出菜单组件开发; 1.2 具体…

el-upload手动上传图片,上传后隐藏上传样式(el-upload上传单张图片,vue2)

简介:上期介绍了使用el-upload上传文件,这次来介绍一下如何使用el-upload上传图片,只能上传一次,上传图片后隐藏上传按钮部分。 实现效果图: 1、首先,想要在项目中使用el-upload组件,同样&#…

检验检疫系统(LIS)源码:C# + MVC + SQLserver + Redis

LIS系统源码技术特点:采用.Net Core新的技术框架、DEV报表、前端js封装、分布式文件存储、分布式缓存等,支持LIS独立部署,Docker部署等多种方式。 技术架构:ASP.NET CORE 3.1 MVC SQLserver Redis等 开发语言:C…

基于全景运动感知的飞行视觉脑关节神经网络全方位碰撞检测

https:/doi.org/10.1155/2023/5784720 摘要: 生物系统有大量的视觉运动检测神经元,其中一些神经元可以优先对特定的视觉区域做出反应。然而,关于如何使用它们来开发用于全向碰撞检测的神经网络模型,很少有人做过工作。为此&#…

【算法优选】 二分查找专题——贰

文章目录 😎前言🌲[山脉数组的峰顶索引](https://leetcode.cn/problems/peak-index-in-a-mountain-array/)🚩题目描述:🚩算法思路🚩代码实现: 🌴[寻找峰值](https://leetcode.cn/pro…

Oracle 简介与 Docker Compose部署

最近,我翻阅了在之前公司工作时的笔记,偶然发现了一些有关数据库的记录。当初,我们的项目一开始采用的是 Oracle 数据库,但随着项目需求的变化,我们不得不转向使用 SQL Server。值得一提的是,公司之前采用的…

golang使用energy开发GUI桌面程序,CEF,LCL

1、概述 仓库:https://github.com/energye/energy 文档:https://energy.yanghy.cn/ Energy 是 Go 基于 CEF(Chromium Embedded Framework) 开发的框架,内嵌 CEF 二进制 使用 Go 和 Web 端技术 ( HTML CSS JavaScript ) 构建支持Windows, …

MongoDB——centOS7环境Mongodb权限管理(图解版)

目录 一、MongDB权限概述1.1、MongDB权限概述1.2、MongDB权限列表 二、Mongodb权限管理示例2.1、创建账号2.1.1、创建管理员用户2.1.2、开启认证2.1.3、创建普通账号 一、MongDB权限概述 1.1、MongDB权限概述 mongodb是没有默认管理员账号,所以要先添加管理员账号…

解决echarts配置滚动(dataZoom)后导出图片数据不全问题

先展现一个echarts&#xff0c;并配置dataZoom&#xff0c;每页最多10条数据&#xff0c;超出滚动 <div class"echartsBox" id"echartsBox"></div>onMounted(() > {nextTick(() > {var chartDom document.getElementById(echartsBox);…

ROS仿真软件Turtlebot-Gazebo的安装使用以及错误处理[机器人避障]

很多时候由于机器人价格比较贵&#xff0c;而且会因为环境因素、操作失误或者摔坏等&#xff0c;所以我们可以先在仿真软件上做测试&#xff0c;也可以避免这些问题&#xff0c;虽然没有那么真实感&#xff0c;可毕竟是免费的嘛。我们可以在这些仿真的机器人身上去学习如何控制…