史上最强C语言教程----枚举和联合

目录

3. 枚举

3.1 枚举类型的定义

 3.2 枚举的优点

3.3 枚举的使用

3.4 枚举类型的大小

4. 联合(共用体)

4.1 联合类型的定义

 4.2 联合的特点

4.2.1 特点阐述

4.2.2 特点应用----判断大小端

4.3 联合大小的计算


3. 枚举

3.1 枚举类型的定义

#include<stdio.h>
enum Day//星期
{
	Mon,
	Tues,
	Wed,
};
int main()
{
	printf("%d %d %d", Mon, Tues, Wed);
	return 0;
}

运行截图:

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

这些可能取值都是有值的,默认从0开始,一次递增1,当然在定义的时候也可以赋初值。

例如:

#include<stdio.h>
enum Color//颜色
{
	RED = 1,
	GREEN,
	BLUE = 4
};
int main()
{
    printf("%d %d %d",RED,GREEN,BLUE);
    return 0;
}

运行截图:

 3.2 枚举的优点

1. 增加代码的可读性和可维护性

2. 和#define定义的标识符比较枚举有类型检查,更加严谨。

3. 防止了命名污染(封装)

4. 便于调试

5. 使用方便,一次可以定义多个常量

3.3 枚举的使用

enum Color//颜色
{
	RED = 1,
	GREEN = 2,
	BLUE = 4
};
enum Color clr = GREEN;//只能拿枚举常量给枚举变量赋值,才不会出现类型的差异。
clr = 5;//ok?这样是不可以的,因为左右类型不一致

3.4 枚举类型的大小

#include<stdio.h>
enum sex
{
	MALE,
	FEMALE,
	SECRET
};
int main()
{
	enum sex s = FEMALE;
	printf("%d\n", sizeof(enum sex));
	printf("%d\n", sizeof(s));
	return 0;
}

运行截图:

结论:无论是枚举类型的大小,还是枚举类型的变量的大小,在内存中都是占据4个字节。

4. 联合(共用体)

4.1 联合类型的定义

联合也是一种特殊的自定义类型 这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间(所以联合也叫共用体)。

比如:

//联合类型的声明
union Un
{
	char c;
	int i;
};
//联合变量的定义
union Un un;
//计算连个变量的大小
printf("%d\n", sizeof(un));
printf("%p\n",&un);
printf("%p\n",&un.c);
printf("%p\n",&un.i);

运行截图:

 4.2 联合的特点

4.2.1 特点阐述

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

4.2.2 特点应用----判断大小端

方法一:运用联合的方式

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

int check_sys()
{
	union S s;
	s.i = 1;
	return s.ch;
}
int main()
{
	union S s;
	s.i = 1;
	int ret = check_sys();
	if (1 == ret)
	{
		printf("小端存储\n");
	}
	else
	{
		printf("大端存储\n");
	}
	return 0;
}

方法二:运用非联合的方式

#include<stdio.h>
int check_sys()
{
	int a = 1;
	return *(char*)&a;
}
int main()
{
	int ret = check_sys();
	if (1 == ret)
	{
		printf("小端存储\n");
	}
	else
	{
		printf("大端存储\n");
	}
	return 0;
}

4.3 联合大小的计算

(1)联合的大小至少是最大成员的大小。

(2)当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。

简而言之就是大于成员变量最大空间数,且是最大对齐数的整数倍。

比如:

union un
{
	int a;//对齐数为4,默认对齐数为8,取较小值,即4
	char arr[5];//最大成员的大小为5,对齐数为1(拿char来算,而不是拿整个数组所占的内存空间来算),默认对齐数为8,取较小值1
	//所以联合体的最大对齐数为4,所以union un的内存空间的大小必须是4的倍数,同时还必须大于5,所以空间大小为8个字节
};
来源url
栏目