admin管理员组

文章数量:1794759

自定义类型:联合体和枚举

1. 联合体

1.1 联合体类型的声明

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

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

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

#include<stdio.h> //联合类型的声明 union UN {     char ch;     int i; }; int main() {     //联合变量定义     union UN un = { 0 };     un.i = 1;     printf("%zd", sizeof(un));     return 0; }

1.2联合体的特点

联合的成员是共用同一块内存空间,联合体的大小至少是最大成员的大小。

1.3 相同成员的结构体和联合体对比

1.4 联合体大小的计算

-> 联合体的大小至少是最大成员的大小。

->当最大成员大小不是最大对齐数的整数倍时,就要对齐到最大对齐数的整数倍。

代码语言:javascript代码运行次数:0运行复制
union Un
{
	char a[5];
	int i;
};

union Un1
{
	short a[7];
	int i;
};
int main()
{
	union Un un = { 0 };
	union Un1 un1 = { 0 };
	printf("%zd\n", sizeof(un));
	printf("%zd\n", sizeof(un1));
	return 0;
}

结果:

1.5 联合一个练习

使用联合体写程序,判断当前机器属于大端还是小端?(百度试题)

代码语言:javascript代码运行次数:0运行复制
int main()
{
	union Un
	{
		char c;
		int i;
	};
	union Un un = { 0 };
	un.i = 1;
	if (un.c == 1)
	{
		printf("小端\n");
	}
	else
	{
		printf("大端\n");
	}
	return 0;
}

举一反三: 不使用联合体判断机器属于大小端字节序列?

代码语言:javascript代码运行次数:0运行复制
int main()
{
	int a = 1;
	if (*((char*)&a)== 1)
	{
		printf("小端\n");
	}
	else
	{
		printf("大端\n");
	}
	return 0;
}

4.枚举类型的声明

关键字:enum。

//枚举日期 enum Day {     Mon,     Tues,     Wed,     Thur,     Fri,     Sat,     Sun, };

//枚举性别 enum Sex {     MALE,     FEMALE,     SECRET, };

//枚举三原色 enum Color {     RED,     GREEN,     BLUE, };

这些枚举的值默认从0开始,依次递增1,也可以对枚举类型赋初值。

如:

//枚举三原色 enum Color {     RED=3,     GREEN=7,     BLUE=8, };

5. 枚举类型的优点

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

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

6 枚举类型的使用

enum Color {     RED=3,     GREEN=7,     BLUE=8, };  enum Color cls = GREEN;//使用枚举常量为枚举变量赋值

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2024-11-20,如有侵权请联系 cloudcommunity@tencent 删除变量编译器程序函数int

本文标签: 自定义类型联合体和枚举