结构体
定义形式
结构体变量的定义和初始化
1.定义结构体同时声明结构体变量、初始化
2.先定义结构体,然后再定义结构体变量
注意:C++中允许不用加struct,既直接"结构体类型名 变量名"
struct stu { int S_num; int S_number; }; int main() { stu A= {9,50}; cout<<A.S_num; return 0; }
3.直接定义(不要结构体类型名)---以后不能单独定义结构体变量
结构体变量的使用
具有相同类型的结构体变量可以进行赋值运算,但是不能输入输出
对结构体变量的成员引用:结构体变量名.成员名
指向结构体的指针变量引用格式:指针变量名->成员名;
结构体作为函数传递有三种:值传递,引用传递,指针传递
typedef关键字
作用:为创建的类型取别名
结构体大小和字节对齐
空结构体大小为1,不为空时要按字节对齐。
三个概念
自身对齐值:数据类型本身的对齐值,结构体或类的的自身对齐值是其成员中最大的那个值,例如char类型的自身对齐值是1,short类型是2;
指定对齐值:编译器或程序员指定的对齐值,32位单片机的指定对齐值默认是4
有效对齐值:min(自身对齐值,指定对齐值)
字节对齐的三个准则
1. 结构体变量的首地址能够被其有效对齐值的大小所整除
2. 结构体的总大小为结构体有效对齐值的整数倍。
3. 结构体每个成员相对于结构体首地址的偏移量都是有效对齐值的整数倍。
要点:
结构体的总大小为结构体有效对齐值的整数倍。
每个元素的起始地址应该是自身长度的整数倍
可以通过#pragma pack(m)来设定变量以m字节对齐
例:指定对齐值为8(64位机默认)
#pragma pack(8) struct st { char c1;//1 char c2;//2 int i1;//8 int 起始地址按照字节对齐的原理应该是它长度4的整数倍 char c3;//12 short s4;//12 short 起始地址按照字节对齐的原理应该是它长度2的整数倍 10 + 2 = 12 double d;//24 double 起始地址按照字节对齐的原理应该是它长度8的整数倍 12->16 + 8 = 24 char c4;//32 24 + 4 = 28 结构体的总大小为8的整数倍 28->32 int i2;//32 28+4 = 32 int i3;//40 short s5;//40---8*5=40(整数倍) }; int main() { cout << sizeof(st) << endl;//40 return 0; }
例:指定对齐值为4字节
#pragma pack(4) struct st { char c1;//1 char c2;//2 int i1;//8 char c3;//12 short s4;//12 double d;//20 char c4;//24 int i2;//28 int i3;//32 short s5;//36 }; int main() { cout << sizeof(st) << endl;//36 return 0; }
公用体(union)
几个不同的变量共享同一个地址开始的内存空间。
成员类型可以是基本数据类型,也可以是构造数据类型。
公用体变量初始化时,只能对第一个成员赋值。
公用体变量所占的内存长度等于最长的成员长度。
公用体变量在一个时刻只能一个成员发挥作用,赋值时,成员之间会互相覆盖,最后一次被赋值的成员起作用。
定义
初始化
使用
公用体变量名.成员名
注意:指针不能指向公用体