1.枚举
1)概念
将可能的取值一一列举。它没有内存对齐的机制。
eg:
enum Color
{
RED,//0
BLUE,//1
GREEN//2
};
如上所示,enum Color就是一个枚举类型。
{}中的内容是枚举类型的可能取值,也叫枚举常量。这些可能取值都是有值得,默认从0开始,一次递增1,当然在定义时也可以赋初值。
2)枚举的优点
1.增加代码的可读性和可维护性
2.和#define定义的标识符计较枚举有类型检查,更加严谨
3.防止了命名污染
4.便于调试
5.使用方便,一次可以定义多个常量
2.联合
1)概念
联合也包含一系列的成员,特征是这些成员公用同一块空间(所以联合也叫共用体)
eg:
//声明
union Un
{
char c;
int i;
};
//联合变量的定义
union Un un;
2)联合的特点
联合的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小(很简单的原因:因为联合要有保存最大成员的能力)
3)联合大小的计算
联合的大小至少是最大成员的大小。
union UN
{
char c;
double b;
int a;
};
int main()
{
union UN Un;
printf("%d ", sizeof(Un));//8
system("pause");
return 0;
}
当最大成员不是最大对齐的整数倍的时候,就要对齐到最大对齐数的整数倍。
union Un
{
int a;//最大对齐数4
char c[5];//最大对齐数1
};
int main()
{
union UN Un;
printf("%d ", sizeof(Un));//8
system("pause");
return 0;
}
3.大小端解释
1)大端模式
是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;这和我们的阅读习惯一致。
2)小端模式
是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低。
如图所示:
3)判断大小端
a.普通方法判断大小端
取出a的地址char* 取出一个字节,解引用* ,如果为1则为小端存储,否则为大端存储。
int check()
{
int a = 1;
return *(char*)&a;
//if (*(char*)&a == 1)//char * 取出一个字节
// return 1;//小端
//else
// return 0;
}
b.联合的方法
union UN
{
char c;
int a;
};
int check1()
{
union UN un={0};
un.a =1;
return un.a;//返回1为小端
}