【C语言进阶学习笔记】四、自定义类型(2)(枚举+共用体)


枚举

什么是枚举?

顾名思义,枚举就是一一列举。将可能的取值都一一列举出来就是枚举。

比如说我们的现实生活中:
①一周的可能取值,从周一到周日,总共7个可能取值
②性别的取值,男,女,保密,总共3种可能取值(当然你也可以再添加一种取值可能,比如说未知,但是添加之后的可能取值仍然是可以一一列举出来的,总共4种可能了)
③月份的可能取值,从一月到十二月,总共12个可能取值
④颜色的可能取值,比如说红橙黄绿青蓝紫


如何定义枚举类型呢?

enum Day//星期
{
    
    
	Mon,
	Tues,
	Wed,
	Thur,
	Fri,
	Sat,
	sun
};
enum sex//性别
{
    
    
	MALE,
	FEMALE,
	SECRET
};
enum color//颜色--三原色 rgb
{
    
    
	RED,
	GREEN,
	BLUE
};

以上定义的enum Day, enum sex,enum color都是枚举类型。
这些可能取值都是有值的,默认从0开始,一次递增1,当然在定义的时候也可以赋初值,这些值叫做枚举常量。
例如:

enum color//颜色--三原色 rgb
{
    
    
	RED = 1,
	GREEN = 2,
	BLUE = 3
};

此时该枚举类型的常量值为1,2,3。


枚举的优点

为什么使用枚举 ?

我们可以使用#define定义常量,为什么非要使用枚举 ?
枚举的优点∶
1.增加代码的可读性和可维护性
2.和#define定义的标识符比较枚举有类型检查,更加严谨。
3.防止了命名污染(封装)
4.便于调试
5.使用方便,一次可以定义多个常量


枚举的使用

enum color//颜色
{
    
    
	RED = 1,
	GREEN = 2,
	BLUE = 4
};
enum color c1r = GREEN;//只能拿枚举常量给枚举变量赋值,才不会出现类型的差异。
clr = 5;// ok ? ?
//枚举常量和常量值是有区别的,将常量直接赋值给枚举常量类型,编译器会报错或警告

扩展:枚举类型的常量如果中间某个值被自定义赋值,那么其前面的值仍然从0开始递增,其后面的值按照自定义的值递增。
在这里插入图片描述
枚举是一种类型,可以用来定义变量-- - 枚举变量,但是其成员是常量值-- - 枚举常量


共用体

共同体类型的定义

共用体也是一种特殊的自定义类型这种类型定义的变量也包含一系列的成员,特征是这些成员共用同一块空间(有的书籍也会将共用体称为联合体)。

比如∶

#include<stdio.h>
	//共用体类型的声明
	union Un
{
    
    
	char c;
	int i;
};
int main()
{
    
    
	union Un u;
	printf("%d\n", sizeof(u));
	printf("%d\n", sizeof(u.c));
	printf("%d\n", sizeof(u.i));

	printf("%p\n", &u);
	printf("%p\n", &(u.c));
	printf("%p\n", &(u.i));
	return 0;
}

在这里插入图片描述
内存分析:
在这里插入图片描述


共用体的特点

共用体的成员是共用同一块内存空间的,这样一个共用体变量的大小,至少是最大成员的大小(因为共用体至少得有能力保存最大的那个成员)。


共用体大小的计算

1.共用体的大小至少是最大成员的大小。
2.当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。

举例:

#include<stdio.h>
union u1
{
    
    
	char ch[5];
	int i;
};
union u2
{
    
    
	short s[7];
	int i;
};
int main()
{
    
    
	printf("%d\n", sizeof(union u1));
	printf("%d\n", sizeof(union u2));
	return 0;
}

分析:

u1中数组ch有5个元素,大小为5个字节,那么u1大小为5,但是因为5不是最大对齐数4(int)的倍数,对齐到最大对齐数4后大小为8。
u2中数组s有7个元素,大小为7 * 2 = 14个字节,14不是最大对齐数4的倍数,对齐到4的倍数后大小为16。

结果展示:
在这里插入图片描述


共用体的应用场景举例

利用共用体的特点,我们可以用来判断计算机的大小端字节序

#include<stdio.h>
union u1
{
    
    
	char ch;
	int i;
};

int main()
{
    
    
	union u1 a;
	a.i = 1;
	if (a.ch == 1)
		printf("小端字节序\n");
	else
		printf("大端字节序\n");
	return 0;
}

理解:
在这里插入图片描述

总结:
结构体、共用体存在内存对齐
枚举、位段不存在内存对齐

猜你喜欢

转载自blog.csdn.net/QIYICat/article/details/118631368