一:什么是结构体
结构体 英文名:Structures 。是一种用户定义的数据类型,它允许你将不同类型的数据组合在一起,变成一个单独的单元,这个单元里面包含了用户所创建的不同类型的变量
二:关于结构体类型
如上图 在这个示例中,Stu就是一个结构体类型,它包含了三个成员:name
(字符数组类型)、age
(整数类型)、float(浮点数类型)。
三:结构体变量的创建和初始化
声明完结构体时就可以创建结构体变量就可以进行结构体变量的创建以及初始化。
如上图示例 创建了一个Stu 类型的S变量,通过“.”操作符将结构体里的变量进行赋值.
也可以用指针通过“->”操作符将变量进行赋值。
四:关于结构体内存大小
是的结构体也存在内存大小,那么结构体的内存大小是如何计算的呢?
通过上图例子可以看到,运用sizeof操作符计算出Stu类型的结构体占用了八个字节的内存。
那么为什么呢?想知道就必须先要了解结构体内存对齐。
结构体内存对齐:
1.什么是结构体内存对齐: 是指编译器在为结构体分配内存时,按照一定的规则将结构体成员按照特定的对齐方式排列在内存中的过程。内存对齐的目的是为了提高内存访问的效率和性能
2.结构体内存对齐规则:
(1) 结构体第一个成员在与结构体变量偏移量为0的地址处
(2) 其他成员则要对齐到某个数字 这个数字为对齐数的整数倍的地址处
对齐数=编译器默认的对齐数与该成员大小相比较 得到的较小值就是对齐数 如vs默认对齐数为8
(3) 结构体的总大小为最大对齐数的整数倍
通过图可以看出,结构体成员a的类型是int,恰巧它是第一个成员 所以它的位置在偏移量为0的位置,a的起始位置为0 又因为a为int类型 int占4个字节与默认对齐数8进行比较 得到的较小结构为4 所以a占用的内存为0-3的空间(共四个字节)。变量c的类型为char 占1个字节 与默认对齐数8比较 得到结果为1 那么它的位置在1的倍数的位置(从a后的位置往下找) 得到结果为5 ,b也是如此。所以a,b,c总共占用了6个字节的大小。但还没完,结构体内存的总大小为最大对齐数的整数倍。这个最大对齐数是结构体成员的最大值 为4。 现在得到了最大对齐数那么只需要计算出最大对齐数的整数倍就可以得到最终的大小。 从刚才得到a,b,c总占用大小为6 显然不是4的倍数 所以要再浪费两个字节大小得到8个字节。最终得到结构体的总大小为8。
看到这里就会不禁在想如果将结构体成员位置顺序调换 是否对内存大小有影响?答案是会的。
这里将 a与c的位置进行调换可以看出 char类型c为偏移量为0的位置占用1个字节 a为int将占用四个字节的位置 而a的对齐数为4 需要从4的倍数开始对齐 所以浪费1-3空间 从4开始占用。b为1占用一个字节,占用了8的位置
从0-8一共占用9个字节的空间 最大对齐数为4 9个字节需要4的3倍才能装下 一共需要12个字节
最终得到结构体的总大小为12。
五:结构体传参
结构体可以进行传参,有传参数以及传指针的方法,通常传递指针的方式,传递指针效率更改,如果害怕指针修改了参数的值可以写形参时在前面加const,以保证参数安全。
标签:字节,占用,知识,C语言,类型,对齐,变量,结构 From: https://blog.csdn.net/2301_80894970/article/details/139179980