结构体、共同体和枚举

结构体
是用户自定义的类型,可以将多种数据的表示合并在一起描述一个完整的对象
定义结构体
语法:
⚠
结构体名为标识符
结构体成员可以是任意数据类型
定义结构体的代码可以放在任意位置,但一般建议放在main函数上面或者头文件中
结构体成员可以用C++的类(例如String),但不提倡
C++中,结构体中可以使用函数,但不提倡
C++中,定义结构体时可以指定缺省值
创建结构体变量
语法:
⚠在C++中,struct
关键字可以不写
⚠可以在定义结构体的事后创建结构体变量名和赋初值
使用结构体
访问结构体
清空结构体(只适用于C++基本数据类型)
==创建的结构体变量未初始化,其值为垃圾值==
复制结构体(只适用于C++基本数据类型)
1、memcpy(目标结构体地址,源结构体地址);
2、直接用" = "
结构体占用内存大小
sizeof(结构体名)
得到整个结构体占用内存大小
整个结构体占用的内存大小不一定等于各结构体成员占用的内存之和
💡原因:结构体内存对齐
结构体指针
声明结构体指针
步骤📈
声明结构体变量
声明结构体指针,指向结构体变量
struct 结构体名 *指针名 = 结构体变量名的地址
⚠结构体变量名未被解释为地址,结构体变量名的地址应为&结构体变量名
通过结构体指针访问结构体成员
方法一:(*指针名).结构体成员名
❗在方法一种括号不能去掉,因为' . '的优先级高于' * '
方法二📣:指针名->结构体成员名
用途
用于函数的参数
用于动态分配内存
⚠结构体指针初始化使用memset()函数时
memset(ptr,0,sizeof(ptr)) ❎
memset(ptr,0,sizeof(stu1)) ✅
原因: ptr为指针,sizeof(指针)任何时候都为8,而不是结构体的内存大小
结构体数组
声明结构体数组
语法:
struct 结构体类型 数组名[数组长度]
初始化结构体数组
访问结构体数组
数组表示法(用的多)
指针表示法(用的少)
结构体中嵌入数组或者结构体
结构体中嵌入一维数组
结构体中嵌入二维数组
把二维数组放入结构体中作为一个成员,调用函数时,把结构体的地址传给函数,函数的形参用指针接收结构体的地址
结构体中嵌入其他结构体
⚠结构体中不能够嵌套自身
结构体中的指针
如果结构体中的指针指向的是动态分配的内存地址
对结构体使用sizeof运算符可能毫无意义
sizeof运算符得到的只包括了结构体中的int型和int指针的内存大小,而不包括指针p指向的动态分配的内存,这是不合理的
对结构体用memset函数可能会造成内存泄露
在C++中,动态分配的内存只能使用指针来访问,如果使用
memset(&s1,0,sizeof(st_stu))
只会清空指针,这会导致两个问题
指针p变为空指针,后续对指针p的操作可能会导致程序崩溃
指针p指向的动态分配的内存未被释放,可能会导致内存泄露
C++字符串String中有一个指向的是动态分配的内存地址的指针,在结构体中使用应注意
共同体
共同体能存储不同的数据类型,但是在同一时间只能存储其中的一种类型
定义语法
注意
共同体占用的内存大小为其中最大的成员占用的内存大小(内存对齐)
全部成员使用同一块内存
共同体中的值为最后被赋值的那个成员的值
匿名共同体没有名字,可以在定义时创建共同体变量,也可以嵌入结构体中
枚举
枚举是一种创建符号常量的方法
枚举的语法
enum colors {red , yellow , blue};
colors成为了一种新的枚举类型名称,用它可以创建枚举变量;red、yellow、blue作为符号常量,默认值为0,1,2
注意事项
用枚举创建的变量取值只能在枚举量范围内
枚举的作用域与枚举变量的作用域相同
可以显式的设置枚举量的值(必须为整数)
可以显式的设置指定的某些枚举量的值(枚举量的值可以重复)
可以将整数强制转化为枚举量,语法为 枚举类型(整数)