目录
前言
上期说到,C语言中的自定义类型分为三类,结构体,枚举和联合体,结构体上期文章已经为大家讲述完毕,今天主要为大家讲述的是枚举和联合体。
枚举
枚举的概念
大家先想想,什么是枚举,相信大家之前也一定听过枚举,枚举的意思就是一一列举。但是我们需要注意的是,并不是所有的事务都可以一一列举出来,比如,全世界的每一个人的身高,这肯定不能列举出来的,为啥?因为太多了,你根本就列举不出来,但是全世界的人的性别确实可以列举出来的,无非就是男和女,所以通过上面的列子我们可以得出一个结论,并不是所有的事务都可以一一列举出来,只有一些较为简单的事务才可以列举出来。以上,相信大家对枚举也已经有了清晰的认知,接下来,我们将更深一步的去研究枚举相关的知识点。
枚举类型的定义
enum day {
mon,
tues,
wen,
thur,
fri,
sat,
sun
};
int main() {
printf("%d %d %d %d %d %d %d", mon,tues,wen,thur,fri,sat,sun);
}
运行上述代码:
不难发现,枚举类型的每一个成员变量竟然都是整型值,而且是一个从0开始的等差数列。那么枚举类型的成员变量可以进行赋值吗?当然是可以的。
enum day {
mon=5,
tues=6,
wen=7,
thur=10,
fri=3,
sat=2,
sun=11
};
int main() {
printf("%d %d %d %d %d %d %d", mon,tues,wen,thur,fri,sat,sun);
}
运行结果如下:
不难发现,枚举的成员变量是可以进行赋值的。
枚举的使用
大家先看上述代码,我们发现,我们使用枚举类型创建了枚举变量之后,枚举变量不能直接赋整型值,只能通过枚举常量进行赋值。
枚举的优点
我们之前学习了宏定义的常量,比如说我们定义了一个 #define name 20 ,既然有了宏定义的常量,我们为什么还要使用枚举常量呢,我们知道,宏定义的常量可以在代码中随意使用,谁都能使用那么安全性就比较差了,但是枚举常量只有枚举变量才能够使用,所以枚举常量的安全系数就相对高一点。
联合体
联合体的定义
什么是联合体呢?名字一定就知道是联合在一起的,我们规定,联合体也是一种自定义类型,联合体变脸可以访问联合体中的成员变量,不过这些成员变量共用一块空间,什么意思呢?
union Un
{
char c;
int i;
};
int main() {
union Un un;
printf("%d\n", &(un.c));
printf("%d\n", &(un.i));
return 0;
}
通过上述代码不难发现,联合体中的成员变量的起始地址是相同的,所以这也就印证了联合体的成员变量是共用同一块空间的。
联合体大小的计算
union Un
{
char c;
int i;
};
int main() {
union Un un;
printf("%d",sizeof(un));
return 0;
}
union Un
{
double j;
int i;
};
int main() {
union Un un;
printf("%d",sizeof(un));
return 0;
}
因为联合体的成员变量共用同一块空间,所以联合体变量的大小至少应该是联合体的最大的成员变量的内存大小。
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));
}
对于上述代码:当最大成员变量的大小不是最大对齐数的整数倍时,应该对齐到最大对齐数的整数倍处。
对于Un1,最大成员变量的大小是c[5],5个字节,但是最大对齐数是i的对齐数4,5不是4的倍数,所以联合体的大小应该对齐到4的整数倍处8,所以联合体的大小应该为8
对于Un2,最大成员变量的大小应该是c[7],14个字节,但是最大对齐数是i的对齐数4,14不是4的倍数,所以联合体的大小应该对齐到4的整数倍处16,所以联合体的大小应该是16
运行结果也是如此。
总结
到此我们已经将自定义类型完全学完,其实学完之后,回过头来发现,这三个自定义类型其实也是有相似之处的,起码结构是相似的。
自定义类型这里并没有晦涩难懂的知识点,但是要尤其注意内存对齐,这是面试中的高频考点。
本期内容较为简单,内容到此结束,希望对大家有所帮助^_^