联合体与枚举
- 联合体
- 枚举问题
联合体
联合体也是由一个或多个成员构成的数据类型,它最大的特点是只为最大的一个成员开辟空间,其他成员共用这个空间,这个东西也叫共用体!!!
union Un
{
char c;
int i;
};
int main()
{
union Un un = { 0 };
un.c = 0x01;
//先为最大的成员开辟空间
un.i = 0x11223344;
printf("%x\n", un.c);
printf("%x\n", un.i);
printf("%d\n", sizeof(un));
return 0;
}
**联合体的特点:
联合的成员是共⽤同⼀块内存空间的,这样⼀个联合变量的⼤⼩,⾄少是最⼤成员的⼤⼩(因为联合⾄少得有能⼒保存最⼤的那个成员)。
**联合体内存分布规则
*联合体大小至少是最大成员的大小!
*当最大成员大小不是最大对齐数整数倍的时候时,要对齐到最大对齐数的整数倍!!!
union Un1
{
char c[5];
int i;
};
union Un2
{
short c[7];
int i;
};
int main()
{
printf("%zd\n", sizeof(union Un1));
printf("%zd\n", sizeof(union Un2));
return 0;
}
解析:第一个联合体最大的一个占5个字节,它不是4的倍数,因此成8个字节,浪费三个字节!!!
第二个联合体的最大一个占14个字节,不是4个倍数,因此浪费2个字节,成16个字节,成为4的倍数!!!
**判断大小端问题!!!
//判断大小端问题
int CheckSys()
{
int a = 0x00000001; // 00 00 00 01
return (*(char*)&a);
}
int main()
{
if (CheckSys() == 1)
{
printf("小段存储模式\n");
}
else {
printf("大端存储模式\n");
}
return 0;
}
/
//判断大小端,运用联合体的内存分布问题,巧妙地运用了联合体!!!
union
{
int i;
char c;
}un;
int main()
{
un.i = 0x11223344;
if (un.c == 0x44)
{
printf("小段存储模式\n");
}
else
{
printf("大段存储模式\n");
}
return 0;
}
枚举问题
1.枚举就是一一列举的问题!!!
//枚举一一列举
enum Day
{
Mon,
Tues,
Wed,
Thur,
Fri,
Sat,
Sun
};
enum Sex
{
MALE = 1,
FEMALE,
SECRET
};
enum Color
{
RED,
GREEN,
BLUE
};
int main()
{
printf("%d\n", Mon);
printf("%d\n", Fri);
printf("%d\n", MALE);
return 0;
}
以上定义的 enum Day , enum Sex , enum Color 都是枚举类型。{}中的内容是枚举类型的可能取值,也叫 枚举常量 。
这些可能取值都是有值的,默认从0开始,依次递增1,当然在声明枚举类型的时候也可以赋初值.
2.枚举类型的优点
/
1. 增加代码的可读性和可维护性
2. 和#define定义的标识符⽐较枚举有类型检查,更加严谨。
3. 便于调试,预处理阶段会删除 #define 定义的符号
4. 使⽤⽅便,⼀次可以定义多个常量
5. 枚举常量是遵循作⽤域规则的,枚举声明在函数内,只能在函数内使⽤
3.枚举类型的使用
enum Color
{
RED,
GREEN,
BLUE
};
int main()
{
enum Color color = RED;
printf(“%d\n”, color);
return 0;
}
------------------------------------------
完结!!!