一. 结构体简述
具有相同或不同类型元素的集合叫做结构体。定义一个结构体,本质是在制作一个类型
二. 结构体的声明和定义
1、简单地声明一个结构体和定义结构体变量
像上面这样就是声明了一个结构体类型struct AA
,此时的 struct AA
就相当于一个类型名。
然后我们可以用这个自己声明的结构体类型去定义变量:
2、声明结构体的同时,也可以定义结构体变量
- 先声明结构体类型 struct AA
- 再定义结构体变量 BB 和 CC
3、匿名结构体
使用方式:声明结构体的时候缺失结构体名,同时定义出一个或n个结构体变量:
4、配合 typedef,声明结构体的同时为结构体取别名
三. 结构体变量的初始化
先弄清楚变量初始化和赋值的区别:
结构体只能被整体初始化,不能被整体赋值,想要赋值的话只能把成员逐个地取出来,然后再去赋值。
补充:数组也是一样的道理:只能整体初始化,不能整体赋值。如果是字符数组想要整体赋值的话,可以使用 strcpy
函数:
四. 结构体成员的访问方法
我们可以通过变量或变量的地址去访问结构体的成员。
五. 结构体大小的计算
1. 计算方法
结构体的计算并不是单纯的相加,而是以一个结构体中所有变量中所对应的最大字节数来对齐,这样取数据元素时就会相对更高效,在整体对齐后微观方面的数据也是以当前最大单位对齐的。
2. 普通结构体
其结构体大小分配如下图
其中空格部分浪费掉了,总共占用了32个字节的空间
大多数情况下,成员变量已经占用的总字节个数并不一定正好为其成员变量中的最大对齐数的整数倍,这时我们需要将其扩大为最大对齐数的整数倍。
3. 包含数组成员的结构体
数组应拆开来看,不能看做一个整体