定义
1)结构体是一种构造数据类型
2)把不同类型的数据组合成一个整体来自定义数据类型
8.2创建结构体类型
struct 结构体类型名 {
类型 成员1名;
类型 成员2名;
...
类型 成员3名;
};
解释:
类型 : 任何学过的类型
成员x名: 标识符
注意:1.成员名和最后都有 ; 号
2.创建结构体类型本身并没有分配任何存储空间,用它定义变量的时候才分配空间
8.3创建结构体变量
8.3.1 利用已经创建的类型创建:struct 结构体类型名 结构体变量名;
例子:
8.3.2创建类型同时创建变量
struct 结构体类型名 {
类型 成员1名;
类型 成员2名;
...
类型 成员3名;
} 结构体变量名;
例子:
8.4结构体类型和变量定义形式
8.4.1一般形式
8.4.2匿名结构体
注意:这种形式一般用在结构体和联合体中会比较方便。
8.4.3 define
8.4.4 typedef(起别名)
(常用)
作用:
(1)可以避免一些人理解的错误
例:char *a,b;
(2)用在结构体上带来方便
(3)在一些很复杂的类型可以使用typedef起别名来带来方便
(4)用typedef来定义与平台无关的类型
typedef int BOOL
8.5计算结构体变量的成员
结构体变量名.成员名
(*结构体变量指针).成员名
结构体变量指针->成员名(重点)
实例:
8.6计算结构体和其变量字节数
sizeof(结构体类型名)
sizeof(结构体变量)
8.7结构体变量赋值
注意: 变量类型必须相同
补充:给数组赋值用strcpy
8.8结构体变量初始化
8.8.1 普通变量
例: struct student student = {"zhangsan", 1, 15, 59.9};
8.8.2 结构体数组
(1) 按结构初始化
例:struct student stu[3]={{"zhangsan", 1, 15},{"lishi", 0, 16}};
(2) 按顺序初始化
例:struct student stu[] = {"zhangsan", 1, 15, "lishi", 0, 16};
实例:
8.9变量对齐
8.9.1 变量对齐
变量地址 % min(变量字节数, 机器位数/8) = 0
8.9.2 结构体成员变量对齐
结构体成员变量地址 % min(变量字节数, 机器位数/8) = 0;
8.9.3 结构体变量对齐
结构体成员变量的最大对齐方式相同
8.9.4 结构体成员变量偏移对齐
结构体成员变量偏移 % min(变量字节数, 机器位数/8) = 0;
补充:使用伪指令#pragma pack(n):C编译器将按照n个字节对齐;
使用伪指令#pragma pack(): 取消自定义字节对齐方式。
例子:#pragma pack(2) //指定按2字节对齐
struct C
{
char b;
int a;
short c;
};
#pragma pack() //取消指定对齐,恢复缺省对齐
另外,还有如下的一种方式(GCC特有语法):
__attribute((aligned (n))): 让所作用的结构成员对齐在n字节自然边界上。如果结构体中有成员的长度大于n,则按照最大成员的长度来对齐。
__attribute__ ((packed)): 取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐。
8.10 共用体(联合体)
union 共用体类型名 {
类型 成员名1;
类型 成员名2;
};
注意:共用体使用方法同结构体完全相同,唯一区别在于:
1. 共用体各个成员共用内存
2. 共用体变量的大小取决于其最大元素的大小
补充:计算机的大小端序:字节序就是变量在内存中存放的方式。
大端序:字数据的高字节存储在低地址中。
数据0x12345678
-------------------------------------------
| 地址 | 0x4000 | 0x4001 | 0x4002 | 0x4003 |
-------------------------------------------
| 内容 | 0x12 | 0x34 | 0x56 | 0x78 |
-------------------------------------------
小端序:字数据的低字节存储在低地址中。
数据0x12345678
-------------------------------------------
| 地址 | 0x4000 | 0x4001 | 0x4002 | 0x4003 |
-------------------------------------------
| 内容 | 0x78 | 0x56 | 0x34 | 0x12 |
-------------------------------------------
8.11 枚举类型
作用;给一组相关的字面常量取名, 并将它们定义为相同类型
用法:enum 枚举类型名 {
常量名1,
常量名2,
...
};
注意:1. 没有指定值时, 常量名1 值取 0, 后面每个常量的值等于前面常量的值加1
2. 可以给常量指定值,让它们从某一整数开始