一、结构体
1. 结构体的声明
例如,描述一个学生的信息:
// 第一种
typedef struct Student
{
char name[20]; // 学生姓名
int age; // 学生年龄
char sex[10]; // 学生性别
}Stu;// 新的类型名
Stu stu1;// 结构体变量
---------------------------------------
// 第二种
struct Stu
{
char name[20]; // 学生姓名
int age; // 学生年龄
char sex[10]; // 学生性别
}stu1;// 结构体变量
struct Stu stu2;// 构体变量
2. 结构体的初始化
(1)在定义结构体变量的同时,进行初始化:
struct Stu stu2 = { "liyong",21,"male" };
(2)在定义结构体变量后,逐个进行初始化:
stu1.name[20] = "liyong";
stu1.age = 21;
stu1.sex[10] = "male";
3. 结构体内存对齐
详见我的另一篇博客,链接:https://blog.csdn.net/qq_42195954/article/details/90116940
二、位段
注意:
位段的成员约束:必须是 int、 unsigned int、 signed int 、 char 类型
位段不跨平台,不可移植。
1. 位段的声明
struct OBJ
{
char a : 3;
char b : 4;
char c : 5;
char d : 4;
};
struct OBJ obj = { 0 };
2.位段的初始化
obj.a = 10;
obj.b = 12;
obj.c = 3;
obj.d = 4;
3.位段的内存分配
在位段的声明中,变量a,b,c,d冒号后面的数字表示:取该类型的几位
因此,我们用画图的方式理解:
由上图可以得出,位段OBJ大小是三个字节。
还有几个例子以便更好理解:
三、枚举
枚举类型和结构体类型的比较:
枚举的取值:枚举类型默认从0开始,一次递增1。
在定义的时候也可以赋初值,类似结构体。
枚举类型的成员是常量,赋初值时前加const。
四、联合
4.1 联合的声明:
union OBJ
{
int a;
char b;
};
union OBJ obj;
首先,联合的成员共用一个最大成员的存储空间,此处 int a; 是最大的成员。
obj的大小:
1.先看最大成员变量的大小
2.考虑对齐数
最终的大小是 最大成员变量大小 加上 某一个较小整数 得出的结果是 对齐数的整数倍 。
上面的声明中,最大成员变量大小是4个字节,最大对齐数是4,4+0=4,最大成员大小是对齐数的整数倍,所以大小是4个字节。
4.2 联合变量的大小:
我们举一个例子:
union Un
{
char c;
int i;
};
int main()
{
union Un un = { 0 };
un.c = 129;
printf("%d\n", un.c);
printf("%d\n", un.i);
system("pause");
return 0;
}
仔细想一想,这个程序输出多少?
我们先来做个分析:
上述给了三个例子说明问题,在联合变量存储中,必须了解先类型提升。
类型提升:https://blog.csdn.net/qq_42195954/article/details/89311467