自定义类型:联合和枚举

0 阅读3分钟

简介:1联合体类型的声明;2联合体的特点;3联合体大小的计算;4枚举类型的声明;5枚举类型的优点;6枚举类型的使用

1 联合体

1.1 联合体类型的声明

像结构体一样,联合体也是由一个或者多个成员构成,这些成员可以是不同的类型。

但是编译器只为最大的成员分配足够的内存空间。联合体的特点是所有成员共用同一块内存空间。所以联合体也叫:共用体

给联合体其中一个成员赋值,其他成员的值也跟着变化。

使用联合体的目的是为了节省空间。联合体成员在同一时间只能使用一个。

#include <stdio.h>
//联合类型的声明
union Un
{
	char c;
	int i;
};

int main()
{
	//联合变量的定义
	union Un un = { 0 };
	//计算连个变量的大小
	printf("%zd\n", sizeof(un));
	return 0;
}

1.2 联合体的大小

  • 联合的大小至少是最大成员的大小。
  • 当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。
#include <stdio.h>
union Un1
{
	char c[5];
	int i;
};
union Un2
{
	short c[7];
	int i;
};
int main()
{
	//下面输出的结果是什么?
	printf("%zd\n", sizeof(union Un1));
	printf("%zd\n", sizeof(union Un2));
	return 0;
}

1.3 联合体判断大小端

联合体的特点是所有成员共用同一块内存空间,这个特点用来判断大小端很合适。

//使用联合体判断大小端
#include <stdio.h>
int cheak_sys()
{
	union
	{
		char c;
		int i;
	}n;
	n.i = 1;
	return n.c;
}

int main()
{
	if (cheak_sys())
		printf("小端\n");
	else
		printf("大端\n");
	return 0;
}

2 枚举类型

2.1 枚举类型的声明

枚举顾名思义就是一一列举。

把可能的取值一一列举。

比如我们现实生活中:

一周的星期一到星期日是有限的7天,可以一一列举

性别有:男、女、保密,也可以一一列举

月份有12个月,也可以一一列举

三原色,也可以列举

这些数据的表示就可以使用枚举了。

enum Color//颜色
{
    RED,
    GREEN,
    BLUE
}

上面定义的enum Color就是枚举类型。

{}中的内容是枚举类型的可能取值,也叫枚举常量

这些可能取值都是有值的,默认从0开始,依次递增1,当然在声明枚举类型的时候也可以赋初值。

下面是一个赋初值的问题:

枚举默认从0开始,所以X1是0,故Y1是1,给了数字后会根据数字向后推,那么Z1是255,A1是256,所以B1是257。

2.2 枚举类型的优点

我们也可以使用#define定义常量,为什么非要使用枚举?

枚举的优点:

  1. 增加代码的可读性和可维护性
  2. #define定义的标识符比较枚举有类型检查,更加严谨。
  3. 便于调试,预处理阶段会删除#define定义的符号
  4. 使用方便,一次可以定义多个常量
  5. 枚举常量是遵循作用域规则的,枚举声明在函数内,只能在函数内使用

有关#define

说明:结构体向最长的char对齐,前两个位段元素一共4+2位,不足8位,合起来占1字节,最后一个单独1字节,一共3字节。另外,#define执行的是查找替换, sizeof(struct _Record_Struct) * MAX_SIZE这个语句其实是3*2+3,结果为9。

2.3 枚举类型的使用

enum Color//颜色
{ 
    RED=1;
    GREEN=2;
    BLUE=4;
};

enum Color clr = GREEN;//使用枚举常量给枚举变量赋值

那是否可以拿整数给枚举变量赋值呢?在C语言中是可以的,但是在C++是不行的,C++的类型检查比

较严格。