1.枚举类型
1.1枚举类型的声明
枚举顾名思义就是⼀⼀列举。
把可能的取值⼀⼀列举。
⽐如我们现实⽣活中:
⼀周的星期⼀到星期⽇是有限的7天,可以⼀⼀列举
性别有:男、⼥、保密,也可以⼀⼀列举
⽉份有12个⽉,也可以⼀⼀列举
三原⾊,也是可以意义列举
这些数据的表⽰就可以使⽤枚举了。
1.2枚举的定义
我们使用代码来演示使用枚举来定义 星期和颜色
enum Day//星期
{
Mon,
Tues,
Wed,
Thur,
Fri, //大括号中放的是枚举的可能取值
Sat,
Sun
};
enum Color//颜⾊
{
RED,
GREEN,
BLUE
};
以上定义的 enum Day ,, enum Color 都是枚举类型。
{ } 中的内容是枚举类型的可能取值,也叫 枚举常量 。
这些可能取值都是有值的,默认从0开始,依次递增1,当然在声明枚举类型的时候也可以赋初值。
1.3枚举类型的优点
为什么使⽤枚举?
我们可以使⽤ #define 定义常量,为什么⾮要使⽤枚举
枚举的优点:
1. 增加代码的可读性和可维护性
2. 和#define定义的标识符⽐较枚举有类型检查,更加严谨。
3. 便于调试,预处理阶段会删除 #define 定义的符号
4. 使⽤⽅便,⼀次可以定义多个常量
5. 枚举常量是遵循作⽤域规则的,枚举声明在函数内,只能在函数内使⽤ 。
1.4枚举类型的使⽤
enum Color//颜⾊
{
RED=1,
GREEN=2,
BLUE=4
};
enum Color clr = GREEN; //使⽤枚举常量给枚举变量赋值
那是否可以拿整数给枚举变量赋值呢?在C语⾔中是可以的,但是在C++是不⾏的,C++的类型检查⽐较严格。
2.联合体
2.1 联合体类型的声明
像结构体⼀样,联合体也是由⼀个或者多个成员构成,这些成员可以不同的类型。
但是编译器只为最⼤的成员分配⾜够的内存空间。联合体的特点是所有成员共⽤同⼀块内存空间。所
以联合体也叫:共⽤体。
给联合体其中⼀个成员赋值,其他成员的值也跟着变化。
代码演示:
//联合类型的声明
union Un
{
char c;
int i;
};
int main()
{
//联合变量的定义
union Un un = {0};
//计算连个变量的⼤⼩
printf("%d\n", sizeof(un));
return 0;
}
这时大家肯定会有疑问,(char)1+(int)4=5 为什么程序输出的是4呢?
大家一定忽略了一点 联合体的特点是所有成员共⽤同⼀块内存空间 我们打印出它们的地址来看观察。
//联合类型的声明
union Un
{
char c;
int i;
};
int main()
{
//联合变量的定义
union Un un = {0};
printf("%p\n", &un);
printf("%p\n", &(un.c);
printf("%p\n", &(un.i);
return 0;
}
不难看出,地址都是同一块地址。
我们通过画图来展示,其中 绿色的是c所占据的内存而绿色的加上白色的一共四个字节都是 i 的。
我们来拓展一下判断机器的大小端。
int a=1;
得到地址 0x 00 00 01
如何判断是大端还是小端呢?
大端就是把高位地址放在高地址,把低位地址放在低地址。
小端就是把低位字节的地址放在低地址,高位字节放在高在高地址。
我们通过观察可以发现大端与小端的差别在于 前两个数字
01(小端) 00(大端)
代码展示:
我们通常是采取指针的形势,我们通过指针拿出前两个地址判断是否存在 1 若存在1则说明是小端。我们先来使用指针来为大家展示,稍后展示联合体的形势。
指针形式:
//判断当前机器是大端还是小端?
#include<stdio.h>
{
int a=1;
if(*(char*)&a==1) //强制类型转化为char*(目的是为了访问一个字节)
return 1;
else
return 0;
int main()
{
int ret= check_sys();
if(ret == 1)
printf("小端\n")
else
printf("大端\n")
return 0;
}
联合体形式:
int check_sys()
{
union
{
int i;
char c;
}un;
un.i = 1;
return un.c; //返回1是⼩端,返回0是⼤端
}
2.2联合体⼤⼩的计算
• 联合的⼤⼩⾄少是最⼤成员的⼤⼩。
• 当最⼤成员⼤⼩不是最⼤对⻬数的整数倍的时候,就要对⻬到最⼤对⻬数的整数倍。
#include <stdio.h>
union Un1
{
char c[5];
int i;
};
union Un2
{
short c[7];
int i;
};
int main()
{
//下⾯输出的结果是什么?
printf("%d\n", sizeof(union Un1));
printf("%d\n", sizeof(union Un2));
return 0;
}
这是为什么呢?
我们先看第一个的最大对齐数是多少?很明显是int类型的4,4的整数倍8.
再看第二个最大对齐数还是4,至少需要14来存放,那么距离14最近的4的倍数就是16.
今天的内容到此结束
后续为大家更新动态内存管理
感谢你的观看