1、概念
结构体与数组相对应,数组只能存放相同类型的数据,而结构体可以存放若干个不同类型的数据。结构体就是我们所称的自主义数据类型。
2、定义方法
在主函数外面自定义
声明格式:
struct(关键字)+结构体名(从规范角度来说,结构体名应该大字)
{
若干个数据(只能申明,不能定义)
};
如何去申明及定义一个结构体变量:
struct +结构体名+变量名={与该结构体成员相符合的具体数据};
3、结构体的内存管理方式:
遵循字节对齐原则
- 字节对齐:结构体声明的时候,系统并不会一次性的将整个结构的内存空间申请出来,系统会先找到结构体内内存占据最大的数据类型,然后先开辟该数据类型的大小空间,然后从每一个结构体成员,开始向内存数据,一旦该内存空间无法完整的存放新的成员,则系统会重新开辟一片内存空间,直到所有成员存放完毕。
- 有时候,某些结构按照第一种字节对齐原则进行内存空间大小的计算后,发现和系统的
sizeof
给出的大小不一致,那么表示此时遵循了第二种字节对齐原则。 - 计算机无论运行速度多快,它一次性读取的数据总是有限制的,这个限制取决于计算机系统的位数,也就是说,32位系统一次性只能读取32个位的数据,64位系统一次性只能读取64个位的数据。
4、结构体的访问方式:
-
通过:结构体变量名‘.’成员变量名;这个访问方式即可作为左值,也可作为右值。
-
由于结构体名不是一个指针,那就意味着,当结构作为实参进行传参的时候,那么当形参改变时对实参是没有影响的。所以对结构体的传参:
使用返回值的方式,由于结构之间能够相互赋值的关系,所有结构可以作为返回值向外返回,并赋值给自己。
使用指针的方式,在函数内部直接修改的就是实参地址上的值。注意:结构体指针有特殊的取值方式。无需对结构体指针取‘*’之后,再进行‘.’访问成员,可以直接使用’->’
方式进行访问。
参数传递小结
结构作为函数参数的三种方式
1、 传递结构成员
2、 传递结构
- 优点:函数处理的是原始数据的副本,保护了原始数据
- 缺点:老版本不支持,传递结构浪费时间和存储空间
- 一般用来处理小型结构数据
3、 传递结构的地址
- 优点:程序的执行速度快,效率高
- 缺点:无法保护数据,函数中的操作有可能会意外影响原结构中的数据 程序员为了追求效率,常用此方案
5、结构体与数组的区别
- 数组只能存放相同类型的数据,而结构体可以存放若干个不同类型的数据
- 结构体之间可以相互赋值。
- 数组通过下标的方式或者通过指针偏移的方式进行访问,而结构体只能通过成员变量的名字进行单一访问。注意,结构体不存在遍历算法
6、联合体和枚举
- 联合体
联合体的自定义只需要把struct
替换成union
即可。
它与结构体的区别在于:
联合体会找到最大成员,然后只分配一次该成员所占内存空间大小。 - 枚举
枚举是一个保存常量的集合,也可以理解成将很多常量集中起来做统一管理。
关键字enum
这些常量从上往下,默认是从0开始,然后递增;