自定义数据类型

自定义数据类型

结构体

结构体的声明

结构体的基础知识

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DAjLKbxi-1605354993141)(D:\鸣人的笔记\3\1605190661396.png)]

结构的声明

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JALi56xp-1605354993142)(D:\鸣人的笔记\3\1605191015357.png)]

变量的声明

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-beYAPnlC-1605354993143)(D:\鸣人的笔记\3\1605191268790.png)]

匿名结构类型

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4Hf7naRO-1605354993145)(D:\鸣人的笔记\3\1605192048015.png)]

结构体的自引用

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WX9stVjb-1605354993146)(D:\鸣人的笔记\3\1605192575895.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aLEVWpEz-1605354993146)(D:\鸣人的笔记\3\1605192883047.png)]

结构体变量的定义和初始化

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cmtmR1ZP-1605354993147)(D:\鸣人的笔记\3\1605193052255.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-09HB0pFV-1605354993147)(D:\鸣人的笔记\3\1605193350880.png)]

结构体内存对齐

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7i9fWFXJ-1605354993147)(D:/鸣人的笔记/3/1605234630851.png)]

在这里插入图片描述

第一,第一个成员在偏移量为0的地方,我们假设第一个成员的内存在第二行开始

第二,其他成员要对齐到对齐数的整数倍,对齐数的概念如上图,因为int a的字节是4,vs默认对齐数是8,所以在这里对齐数是4,4的整数倍是4,所以int a在第五行开始,也就是紫色的地方

第三,同第二理char c2的对齐数是1,那么它就在9行,此时这个结构体一共占了9个字节

最后,结构体的总大小是最大对齐数的整数倍,在这里也就是4的最大整数倍,因为此时已经占了9个了,所以是12,所以这个结构体大小是12

很明显,上面的规则中第四个没有使用到,那么结构体嵌套的问题是什么样呢

在这里插入图片描述

首先计算出结构体s3的大小是16

结构体s4中嵌套了s3

第一,结构体s4中第一个成员是char类型,占一个字节,如右上蓝色

第二,嵌套的结构体对齐到自己的最大对齐数的整数倍,s3中最大对齐数是8,整数倍是8,所以从第八个位置开始,s3的大小已经计算出是16,占16个字节大小

第三,double型的占8个字节,所以向下占8个位置,如右上紫色

最后,可以看出一共占了32个字节(中间红色的是被浪费的)

但结构体的整体大小是最大对齐数(含嵌套结构体)的整数倍,结构体s4中的最大对齐数是结构体s3,也就是16,32是16的整数倍,所以结构体s4的大小是32

有的人可能会好奇,VS默认对齐数是8,那么其他编译器呢。这里如果其他编译器没有默认对齐数,那么该成员大小的最小值就是对齐数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NKIeUlNC-1605354993149)(D:/鸣人的笔记/3/1605245600438.png)]

那么内存对齐会浪费空间为什么要内存对齐呢

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1dErJJkG-1605354993149)(D:/鸣人的笔记/3/1605245650175.png)]

那在设计结构体的时候,既要满足对齐,又要节省空间,应如何做

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RlNgVygD-1605354993149)(D:/鸣人的笔记/3/1605246348706.png)]

修改默认对齐数

#pragma pack(n)

这里的n就是我们自己修改的默认对齐数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tWHg349y-1605354993149)(D:/鸣人的笔记/3/1605246822183.png)]

结构体成员偏移量

offsetof是个宏,不是函数

offsetof–>头文件#include<stddef.h>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-clqqfHT7-1605354993150)(D:/鸣人的笔记/3/1605247214687.png)]

结构体传参

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O8WoXoZs-1605354993151)(D:/鸣人的笔记/3/1605250399355.png)]

很显然say2传参方式更好,原因:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-itv4b7SY-1605354993151)(D:/鸣人的笔记/3/1605250425489.png)]

位段

什么是位段

在这里插入图片描述

位段的内存开辟

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MDaHuj3r-1605354993151)(D:/鸣人的笔记/3/1605252206748.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ACKbktUq-1605354993151)(D:/鸣人的笔记/3/1605252434523.png)]

一次开辟一个整形空间,这个整形空间4个字节,32个bite位,a需要2个,b需要5个,c需要10个,这一个空间一共32个,但是已经使用了17个,剩下15个,不够d使用了,那么前面15个bite位全都丢掉,重新开辟一个整形空间,也就是4个字节,32个bite位,然后使用30个bite位给d,剩下两个丢掉,也就是说,这个位段一共使用了8个字节

位段就是为了节省空间存在的

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bv9RwNSP-1605354993152)(D:/鸣人的笔记/3/1605346060749.png)]

结构体的话要开辟四个字节空间,但是位段只需要三个字节空间

位段的弊端

位段不能跨平台,可移植程序应避免使用位段

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-c70mdTVr-1605354993153)(D:/鸣人的笔记/3/1605346248850.png)]

枚举

枚举的基本概念及使用

枚举也就是一一列举

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4w1xd0u8-1605354993154)(D:/鸣人的笔记/3/1605348562683.png)]

在这里插入图片描述

枚举的优点

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gwGDJvqg-1605354993155)(D:/鸣人的笔记/3/1605349075331.png)]

联合-联合体(共用体)

联合类型的定义

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dnCnNBAI-1605354993155)(D:/鸣人的笔记/3/1605349614539.png)]

联合的特点

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8YEZgKb7-1605354993155)(D:/鸣人的笔记/3/1605349545867.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lYibQPtI-1605354993155)(D:/鸣人的笔记/3/1605349506597.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NvoKLGoq-1605354993155)(D:/鸣人的笔记/3/1605349896300.png)]

判断计算机的大小端存储方式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i3gsFYyg-1605354993156)(D:/鸣人的笔记/3/1605350275789.png)]

所以如果想要判断存储方式(比如int a的存储方式)是小端还是大端,就可以看第一个字节(一个整型里有4个字节)是不是1

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nXfiG5vh-1605354993156)(D:/鸣人的笔记/3/1605350730397.png)]

但这种方法不太好,我们可以自己封装一个函数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-k55SFTPl-1605354993157)(D:/鸣人的笔记/3/1605350852756.png)]

也可以利用我们刚学到的联合体的知识解决

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-glR4OMMD-1605354993157)(D:/鸣人的笔记/3/1605352290295.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5cxbKX0I-1605354993158)(D:/鸣人的笔记/3/1605351628909.png)]

联合大小的计算

在这里插入图片描述

在这里插入图片描述


作者:吕文康
学校:山东第一医科大学
2020年11月14日

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值