2022-04-02-
摘要
结构体
结构体类型的声明
结构的自引用
结构体变量的定义和初始化
结构体内存对齐
结构体传参
结构体实现位段(位段的填充&可移植性)
枚举
枚举类型的定义
枚举的优点
枚举的使用
联合
联合类型的定义
联合的特点
联合大小的计算
总结
目录
结构体的声明
常规的结构的声明太过简单常见,不再过多阐述。
特殊声明
在声明结构体的时候可以不完全的声明
struct
{
int i;
double d;
char c;
}x;
struct
{
int i;
double d;
char c;
}arr[10], * px, x1;
注意到上面两个结构体的声明并没有标签
也就是说我们只能在声明结构体的时候创建变量,一旦声明结束,就再也找不到这个结构体的标签,自然无法使用它创建变量。
那么还要一个问题:
上面的 x1和x一样吗?
或者说下面这个代码非法吗?
px = &x;
警告:
编译器会把上面的两个声明当成完全不同的两个类型。
所以是非法的。
结构的自引用
在结构体中包含一个类型为该结构本身的成员可行吗?
//代码1
struct Node
{
int data;
struct Node next;
};
//可行否?
如果可以,那sizeof(struct Node)是多少?
显然这是不行的,它会无休止的递归下去,非法非法。
正确打开方式:
//代码2
struct Node
{
int data;
struct Node* next;
};
而结构体中包含一个自身结构体的指针就不存在这个问题了,结构体的大小是确定的,并且可以在结构体中访问和自身类型一样的结构体。
每次定义变量都要加个struct实在麻烦,我们使用typedef将代码简化一下,下面对吗?
//代码3
typedef struct
{
int data;
Node* next;
}Node;
//这样写代码,可行否?
//答案是不行的,在结构体内typedef还没有将这个类型重新定义一个名字,自然无法使用这个新类型。
//解决方案:
typedef struct Node
{
int data;
struct Node* next;
}Node;
结构体变量的定义和初始化
有结构体的声明,那么定义一个结构体再简单不过了,就和定义普通变量一样就好。
struct Point
{
int x;
int y;
}p1; //声明类型的同时定义变量p1,p1是全局的
struct Point p2; //定义结构体变量p2,全局的
//初始化:定义变量的同时赋初值。
struct Point p3 = {
x ,y };//类似数组初始化
struct Stu //类型声明
{
char name[15];//名字
int age; //年龄
};
struct Stu s = {
"zhangsan"