自定义类型:结构体(内存对齐),枚举,联合
文章目录
- 结构体
- 结构体的声明
- 结构体的基础知识
- 结构体的声明
- 特殊的声明
- 结构体的自引用
- 结构体变量的定义和初始化
- 结构体的内存对齐
本章重点
- 结构体
结构体类型的声明
结构体的自引用
结构体变量的定义和初始化
结构体内存对齐
结构体实现位段(位段的填充&可移植性)
- 枚举
枚举类型的有点
枚举的优点
枚举的使用
- 联合
联合类型的定义
联合的特点
联合大小的计算
结构体
结构体的声明
结构体的基础知识
结构是一些值的集合,这些值成为成员变量。结构的每个成员可以是不同类型的变量
结构体的声明
struct Book {
char book_name[20];
char author[20];
int price;
char id[20];
};
分号前面可以加结构体变量,是全局变量
特殊的声明
在声明结构的时候,可以不完全声明
struct {
char book_name[20];
char author[20];
int price;
char id[20];
}sb1, sb2;
这个在声明的时候省略了结构体的标签,也叫作匿名结构体类型只能使用一次
那么问题来了?
struct {
char book_name[20];
char author[20];
int price;
char id[20];
}sb1;
struct {
char book_name[20];
char author[20];
int price;
char id[20];
}* ps;
int main() {
ps = &sb1;
return 0;
}
**警告:**编译器会把上面的两个声明当成完全不相同的类型。所以是非法的
结构体的自引用
使用场景,就是链表当中
struct Node {
int data;
struct Node* next;
};
结构体变量的定义和初始化
有了结构体那么如何定义变量,
struct Node {
int data;
struct Node* next;
};
struct Point {
int x;
int y;
}p1; //声明类型的同时定义变量p1
struct Point p2;//定义结构体变量p2
//初始化:定义变量的同时赋值
struct Point p3 = { x, y };
结构体的内存对齐
struct S1 {
char c1;
int i;
char c2;
};
struct S2 {
char c1;
char c2;
int i;
};
#include <stdio.h>
int main() {
printf("%d\n", sizeof(struct S1));
printf("%d\n", sizeof(struct S2));
}
结果是什么?
这是因为什么那?
就是结构体内存对齐,这里在介绍一个函数
offsetof
,
offsetof (type,member)
,这个函数的功能就是计算结构体成员相对于起始位置的偏移量
这是对应的偏移量,所以怎么画图那(这是根据偏移量计算的)
如何计算?
首先掌握结构体对齐的规则:
- 第一个成员在与结构体变量偏移量为0的地址处
- 第二个成员开始,要对齐到某个【对齐数】的整数倍到的偏移处,对齐数:结构体成员自身大小和默认对齐数的较小值
VS: 8
Linux: 默认不设对齐数(对齐数是结构体成员的自身大小)