这种存储区的类型叫结构体类型,这种类型
需要程序员编写语句创建出来
结构体类型存储区里可以包含多个子存储区,
每个子存储区可以用来记录一个数字
结构体不同子存储区的类型可以不同,子存储区
的类型也可以是结构体类型
结构体声明语句可以用来创建结构体类型
声明结构体的时候需要使用struct关键字
结构体声明语句中包含多个变量声明语句,
每个变量叫做结构体的成员变量,每个
成员变量代表了结构体存储区的一个
子存储区
成员变量声明语句不会分配存储区,它们
只是用来表示子存储区的类型和名称
C语言里结构体不能包含函数
结构体声明语句不会分配内存,所以可以写在
头文件里
可以把结构体作为类型声明变量,这种变量
叫结构体变量
结构体变量被分配了存储区,它们可以用来
记录数字
声明结构体变量的时候需要把struct关键字和
结构体名称一起作为类型名称使用
typedef关键字可以用来给一个类型起别名
通常会给结构体类型起别名,这个别名就可以
作为结构体类型名称使用
可以把声明结构体类型的语句和起别名的语句
合并成一条语句
这个时候可以省略结构体本身的名称
声明结构体变量的时候也应该进行初始化
可以象初始化数组一样初始化结构体变量
结构体变量通常不会作为整体使用,一般
一次只使用其中的某个子存储区
可以采用以下写法表示结构体里的某个
子存储区
prsn.age
其中prsn是一个结构体变量名称,age是一个
成员变量名称
同类型结构体变量之间可以直接赋值
结构体指针可以和结构体存储区捆绑
当结构体指针和结构体存储区捆绑后就可以
采用以下写法表示子存储区
p_person->age
其中p_person是一个结构体指针,age是一个
成员变量名称
结构体类型的变量可以直接作为形式参数使用
直接使用结构体变量做形式参数会导致时间
和空间的浪费
采用结构体指针作为形式参数可以避免这个
问题
结构体指针做形式参数的时候尽量使用const
关键字声明
可以直接把结构体变量作为返回值使用,这个
时候需要被调用函数提供一个结构体类型
的存储区用来存放返回值
这也会造成时间和空间的浪费
使用结构体存储区的地址作为返回值可以避免
这个问题(这个时候被调用函数需要提供一个
结构体指针存储区记录这个返回值)
不要使用局部结构体变量的地址作为返回值
一个存储区的地址一定是它自身大小的整数倍
(双精度浮点类型存储区的地址只需要是4
的整数倍就可以了)
这个规则叫数据对齐
结构体的子存储区通常也需要遵守数据对齐的
规定
数据对齐可能导致结构体的子存储区之间有空隙
结构体存储区大小必须是它所包含的占地最大
的基本类型子存储区大小的整数倍(如果
这个基本类型子存储区的类型是double则
结构体存储区的大小只需要是4的整数倍)
这个规则叫数据补齐
数据补齐可能造成结构体最后有浪费的字节
预习:
1.枚举和联合
2.二级指针
3.函数指针
4.动态内存分配