目录
1.结构体
关于结构体的基础知识请看这篇博客初始C语言结构体的详细讲解,这里我们着重讲解一下结构体在内存中的存储。
结构体内存对齐
我们已经知道一些基本数据类型在内存中所占字节大小,如char类占1个字节,int型占4个字节,double型占8个字节。
那么,结构体又是如何计算内存大小的呢,这就涉及一个重要知识点:结构体内存对齐。
让我们先看个例子:
struct S1
{
char c1;
int i;
char c2;
};
struct S2
{
char c1;
char c2;
int i;
};
int main()
{
printf("%d\n", sizeof(struct S1));
printf("%d\n", sizeof(struct S2));
}
运行结果如下:
为什么s1,s2成员变量相同,只是顺序不同结果就不同呢?
首先我们得了解结构体的对齐规则:
1. 第一个成员在与结构体变量偏移量为0的地址处。
2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。
VS中默认的值为8
3. 结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。
4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整
体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。
下面我们画图讲解一下上述例题的结构体struct s1:
同理,可得struct s2大小为8.
2.枚举
2.1枚举类型的定义
enum Day//星期
{
Mon,//0
Tues,//1
Wed,//2
Thur,//3
Fri,//4
Sat,//5
Sun
};
enum Sex//性别
{
MALE,//0
FEMALE,//1
SECRET//2
};
以上定义的 enum Day , enum Sex 都是枚举类型。
{ }中的内容是枚举类型的可能取值,也叫 枚举常量
这些可能取值都是有值的,默认从0开始,一次递增1,当然在定义的时候也可以赋初值。
enum Color//颜色
{
RED=1,
GREEN=2,
BLUE=4
};
2.2 枚举的优点
我们可以使用 #define 定义常量,为什么非要使用枚举?
枚举的优点:
1. 增加代码的可读性和可维护性
2. 和#define定义的标识符比较枚举有类型检查,更加严谨。
3. 防止了命名污染(封装)
4. 便于调试
5. 使用方便,一次可以定义多个常量
关于枚举的使用,后面写通讯录代码会讲到。
3.联合(共用体)
3.1联合类型的定义
3.2 联合的特点
联合的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小(因为联
合至少得有能力保存最大的那个成员)。
接下来进一步说明两变量的关系
请看图解:
3.3 联合大小的计算
1.联合的大小至少是最大成员的大小。
2.当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。
3.4联合体的巧妙运用
在C语言---整形在内存中的存储最后我们讲解了如何用指针法判断编程环境大小端,
今天我们在讲如何巧用联合体判断大小端,代码如下:
int check()//联合体方法
{
union Un
{
char c;
int i;
}u;
u.i = 1;
return u.c;
}
int main()
{
if (check() == 1)
{
printf("小端\n");
}
else
{
printf("大端\n");
}
return 0;
}