5 结构体、共用体
5.1 结构
5.1.1 如何定义一个结构
结构体的使用分为两步,一是结构的定义,二是结构变量的声明
struct student//结构的定义
{
char name[20];
int age;
float weight;
};
[struct] student A;//结构变量的声明,[]:可省略
struct student//结构的定义
{
char name[20];
int age;
float weight;
} A;//结构变量的声明
struct
{
char name[20];
int age;
float weight;
} A;//结构变量的声明,没有类型名称的结构
结构可以相互赋值,利用结构来处理数组的整体赋值操作。
5.1.5 结构体变量的sizeof
结构体变量的大小不是由组成类型大小的简单叠加,而涉及到字节对齐机制。成员变量的定义顺序也会影响结构体变量占据的内存大小。
- 结构体变量的首地址能够被其最宽基本类型成员的大小所整除
- **每个成员相对于结构体首地址的偏移量都是成员大小的整数倍。**否则Internal Adding。复合成员相对于结构体首地址的偏移量都是复合成员中最宽简单类型成员大小的整数倍
- 结构体的总体大小为结构体最宽基本类型的整数倍。否则Trailing Padding
字节对齐有助于加快计算机的取数速度,节省指令周期。
5.2 共用体
在公用体中,各种数据 类型在内存中占据相同的地址,换句话说,在某个确定的时刻,共用体只能表示一种数据类型。
5.2.1 共用体的定义
union 共用体名称
{
存储数据列表
};
union info
{
int grade;
char department[20];
};
5.2.3 共用体变量的声明和初始化
[union] 共用体 共用体变量;
info person={2};
初始化只能对列表中第一个变量进行初始化。