大家好!今天给大家带来的是C语言中自定义类型:联合和枚举的一些内容,超级适合编程小白学习和复习哦。话不多说,直接上代码,一起来看看吧!!!
1.联合体
1.1与结构体的类比
- 结构体struct:多个成员,每个成员都有自己独立的内存空间
- 联合体union:多个成员,共用同一块内存空间
- 所以,联合体也叫:共用体
1.2联合体类型的声明
//联合体类型的声明
union stu
{
char c;//1
int i;//4
};
int main()
{
union stu u = { 0 };//联合变量的定义及初始化
//计算变量的大小
printf("%d\n", sizeof(u));//4
printf("%p\n", &u);//012FFCE8
printf("%p\n", &(u.c));//012FFCE8
printf("%p\n", &(u.i));//012FFCE8
return 0;
}
注:给联合体其中⼀个成员赋值,其他成员的值也跟着变化。
1.3相同成员的结构体和联合体的对比
struct S union
{ {
char c; char c;
int i; int i;
}; };
struct S s = {0}; union Un u={0};
1.4联合体大小的计算
- 联合体的大小至少是最大成员的大小
- 当最大成员的大小不是最大对齐数的整数倍时,要对齐到最大对齐数的整数倍
#include <stdio.h>
union Un1
{
char c[5];//1 8 1 大小:5->8
int i;//4 8 4 故最大对齐数是4
};
union Un2
{
short c[7];//2 8 2 大小:14->16
int i;//4 8 4 故最大对齐数是4
};
int main()
{
//下⾯输出的结果是什么?
printf("%d\n", sizeof(union Un1));//8
printf("%d\n", sizeof(union Un2));//16
return 0;
}
1.5联合的一个练习:判断大小端?
以前的写法:
int check_say()
{
int n = 1;
return *(char*)&n;//返回第一个字节存放的数
}
int main()
{
int ret = check_say();
if (ret == 1)
{
printf("小端存储\n");
}
else
printf("大端存储\n");
return 0;
}
用联合优化后的写法:
int check_say()
{
union
{
char c;
int i;//联合中,i和c放在同一块内存空间中
}u;
u.i = 1;//两个成员共用一块空间
return u.c;//从一块空间中拿出一部分空间
}
int main()
{
int ret = check_say();
if (ret == 1)
{
printf("小端存储\n");
}
else
printf("大端存储\n");
return 0;
}
2.枚举
2.1枚举类型
枚举enum: 把可能的值一一列举出来
enum Day//星期
{//这里是把一个星期的所有可能列举出来
Mon,
Tues,
Wed,
Thur,
Fri,
Sat,
Sun
};
enum Color//颜⾊
{
RED,
GREEN,
BLUE
};
说明:
enum Color//颜⾊
{
RED=5,//5
GREEN,//6
BLUE//7
};
int main()
{
//取值默认从0开始,若给第一个赋值为a,则从a开始依次递增
printf("%d\n", RED);a
printf("%d\n", GREEN);a+1
printf("%d\n", BLUE);a+2
return 0;
}
- {}内容是枚举类型的可能取值,也叫枚举常量
- 默认从0开始,依次递增:0,1,2…
- 也可以赋初值,若给第一个常量赋初值为a,则从a开始,依次递增:a,a+1,a+2…
2.2枚举的优点
我们知道,#define也可以定义常量,为何还要用枚举来定义常量呢?
枚举的优点:
- 增加代码的可读性和可维护性
- 和#define定义的标识符⽐较枚举有类型检查,更加严谨。
- 便于调试,预处理阶段会删除 #define 定义的符号
- 使⽤⽅便,⼀次可以定义多个常量
- 枚举常量是遵循作⽤域规则的,枚举声明在函数内,只能在函数内使⽤
2.3枚举类型的使用
使用枚举常量给枚举变量赋初值,
是不是感觉很巧妙呢?
enum Color//颜⾊
{
RED = 1,
GREEN = 2,
BLUE = 4
};
enum Color clr = GREEN;
int main()
{
printf("%d\n", clr);//2
return 0;
}
- 那是否可以拿整数给枚举变量赋值呢?
在C语⾔中是可以的,但是在C++是不⾏的,C++的类型检查⽐较严格。
好了,以上就是摆子今天给大家带来的关于自定义类型——联合和枚举 的有关内容了。本人学识浅薄,若有纰漏之处,还请大家多多指正,别忘了一键三连哦!!!