自定义类型——枚举和联合体
1.枚举
枚举就是把所有可能的取值都意义列举。其在C语言的定义为“enum (key) { valus };”
//定义性别的枚举
enum Sex
{
MALE, //男
FEMALE, //女
SECRET //保密
};
enum Sex2
{
MALE_1 = 2,
FEMALE_1 = 1,
SECRET_1 = 0
};
//使用枚举
int main()
{
enum Sex s = MALE;
//初始化枚举为“MALE”,枚举是将所有可能都一一举出了,所以初始化只能取定义里面的值
printf("%d",s); //值为0
//枚举里面的元素的默认是从0开始排序的
printf("%d %d %d", MALE_1, FEMALE_1, SECRET_1); // 2 1 0
//枚举里面的属性也可以在定义是修改值,但不能在调用时再进行定义
return 0;
}
枚举的优点(为什么要使用枚举):
1.增加代码的可读性和可维护性
2.和#define定义的标识符比较枚举有类型检查,更加严谨
3.防止了命名污染(封装)
4.便于调试
5.使用方便,一次可以定义多个常量
C语言的运行在计算机里的过程:
C语言的源代码 --> 预编译 --> 编译 --> 链接 --> 可执行程序 --> 运行(调试)
2.联合(联合体、共用体)
联合也是一种特殊的自定义类型,这种类型定义的变量也包含一系列的成员,特征是这些成员共用同一块空间,联合体的成员是共用一块内存空间的,因此这个一个联合变量的大小,至少是最大成员的大小,所以联合体的使用,对联合成员同一时间只能使用一个。
联合体的定义:union (key) { valus };
//联合体的定义
union Un
{
char c;
int i;
};
int main()
{
union Un u;
printf("%p %p %p \n",&u,&u.c,&u.i ); //运行结果三个都一样
//联合体的特点就是共用一个内存,极大的节省了空间
printf("%d \n",sizeof(u)); // 4
//联合体的内存空间为最大成员的内存
return 0;
}
注:当最大成员的大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍
例题:
判断计算机的大小端存储问题
低地址 ------- 高地址
[][]……[11][22][33][44]…… 大端存储模式
[][]……[44][33][22][11]…… 小端存储模式
// 这里以储存1为例八位为例
//1 --> 00000001
//如果其为大端存储方式的话内存中的第一个char就应该为 ‘00’
//如果其为小端存储方式的话内存中的第一个char就应该为 ‘01’
//指针方式:取 1 的第一个char值,判断为0还是1即可
//联合体方式:因为联合体是共用一个内存的,因此定义一个int类型跟一个char类型,int类型初始
//化后,内存中为 1 的值,所以char的定义就为int空间的第一个字节
check_sys(int x)
{
//return *(char*)&x; //指针方法
union Un
{
char c;
int i;
}u;
u.i = 1;
return u.c; // 联合体方式
}
int main()
{
int a = 1;
int ret = check_sys(a);
ret ? (printf("小端")) : (printf("大端"));
return 0;
}
图解联合体共用内存:
总结:对于枚举跟联合体,其C语言的定义跟结构体是相同的,不同的是其性质不一样。结构体适用于对象的定义,枚举则是用于固定的选项时定义,联合体是为了节省空间,可以用于对一些不适合同时使用而属性又不相同的元素。
目前是对C语言相关基础的知识进行系统的学习和笔记,后期再对数据结构的相关知识进行学习和笔记。