自定义类型:结构体、枚举、联合
文章目录
- 1. 结构体
-
- 1.1 结构体介绍
- 1.2 结构成员的类型
- 1.3 结构体的声明
- 1.4 特殊的声明(匿名结构体)
- 1.5 结构体的自引用
- 1.6 结构体变量的定义和初始化
- 1.7 结构体内存对齐(计算结构体大小)
- 1.8 修改默认对齐数
- 1.9 结构体传参
- 2. 位段
-
- 2.1 什么是位段
- 2.2 位段的内存分配
- 2.3 位段的跨平台问题
- 2.4 位段的应用
- 3. 枚举
-
- 3.1 枚举的定义
- 3.2 枚举的优点
- 3.3 枚举的使用
- 4.联合(共用体)
-
- 4.1 联合类型的定义
- 4.2 联合的特点
- 4.3 联合大小的计算
1. 结构体
1.1 结构体介绍
结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。
1.2 结构成员的类型
结构的成员可以是标量、数组、指针,甚至是其他结构体。
1.3 结构体的声明
结构体有由关键字 struct 来进行声明,具体格式如下,下面的结构体类型是 struct tag(关键字+自定义名字)
例如描述一个学生
使用 typedef 可以对结构体类型进行重命名,如下图将 struct tag 类型重命名成 tag ,本质上 ** tag 就是 struct tag**,在创建结构体变量时更方便
1.4 特殊的声明(匿名结构体)
在声明结构的时候,可以不完全的声明(在声明结构体的时候不起自定义名字),这种声明的结构体叫做匿名结构体,匿名结构体只能在声明的时候创建变量。
比如:
注意,变量x是一个匿名结构体变量,p是一个匿名结构体类型的指针,最然这两个匿名结构体看起来一样,但是 p != &a,编译器会认为这是两种不同的结构体类型
1.5 结构体的自引用
我们知道结构体的成员可以是结构体类型,但是结构体中不能包含一个类型为该结构本身的成员(自引用)
例如:
这是因为当我们计算 sizeof(struct Node) 时,首先计算变量data 的大小,然后计算变量 next 的大小,但是结构体变量 next 里面又包含了一个结构体变量,形成套娃,无法计算大小,因此不能包含一个类型为该结构本身的成员
那我们想通过这个结构体变量访问下一个类型为该结构本身的成员该如何做呢?
我们可以在结构中包含这个结构体类型的指针变量用来存放类型为该结构本身的成员的地址
比如:
这时就可以通过指针解引用来访问下一个类型为该结构本身的成员 ,并且sizeof(struct Node) 也能够计算出来
注意:
我们知道可以使用typedef对类型进行重命名,并且可以使用结构体指针来进行自引用, 那么下面这种方式可行吗?