【C语言】自定义数据类型:枚举+共用体

前言

之前我们学习了自定义数据类型里的结构体,还顺带着学习了位段
今天,我们就来学习枚举和共用体,我们开始吧

自定义类型:结构体

位段详解

枚举

枚举就是一一列举

枚举类型的定义

枚举类型的创建

enum Day
{
	mon,//此处是逗号
	tues,
	thur,
};//;不能少

enum:是类型关键字
{}里的就是可能的取值,都是常量
第一个常量的值默认是0,之后挨个增加

初始值可以改变,当不改变时就认为是前一个常量的值加一
下面给出三个例子方便大家理解

1
enum Day
{
	mon,
	tues,
	thur,
};

int main()
{
	enum Day d1 = mon;
	printf("%d %d %d\n", mon, tues, thur);
	return 0;
}

运行结果:
在这里插入图片描述

2
enum Day
{
	mon = 1,
	tues = 3,
	thur = 5,
};

int main()
{
	enum Day d1 = mon;
	printf("%d %d %d\n", mon, tues, thur);
	return 0;
}

运行结果:
在这里插入图片描述

3
enum Day
{
	mon,
	tues = 3,
	thur,
};

int main()
{
	enum Day d1 = mon;
	printf("%d %d %d\n", mon, tues, thur);
	return 0;
}

运行结果:
在这里插入图片描述

枚举类型的使用

enum Day
{
	mon,
	tues,
	thur,
};

int main()
{
	enum Day d1 = mon;

	return 0;
}

创建变量需要写上关键字,并且变量的值只能是定义中的某一个值

注意

不要给枚举常量赋值,这是错误的

enum Day d2 = 4;

枚举类型的大小

我们用一段代码来解释这个问题:

enum Day
{
	mon,
	tues,
	thur,
};

int main()
{
	enum Day d1 = mon;
	printf("%zd\n", sizeof(d1));

	return 0;
}

运行结果:
在这里插入图片描述

原因

因为上文提到了,mon这些成员的值默认是整数,都是int类型

所以我们可以知道他们的大小都是4个byte

注意

枚举类型的值是不可改变的,是由编译器决定的,所以大小就是固定的4byte

枚举的优点

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

联合(共用体/联合体)

联合的定义


union Un
{
	char c;
	int i;
};

int main()
{
	union Un u;

	return 0;
}

union是联合关键字

联合的特点

先来看一段代码,下面代码的结果是什么

union Un
{
	char c;
	int i;
};

int main()
{
	union Un u;

	printf("%zd\n", sizeof(u));

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

	return 0;
}

运行结果:
在这里插入图片描述
能看出来,他们的地址是相同的,也就是说他们都从同一块空间开始存储、占用同一块空间,这就是共用体的名称来源

所以联合体至少是最大成员的大小,在上面这道题中,就是4

提示

因为成员都从同一块空间存储,所以不能同时使用

联合体的使用

引入

先看一道笔试题:

判断当前机器的大小端存储(字节存放顺序)

使用指针
int check_sys()
{
	int a = 1;
	return *(char*)&a;
}

int main()
{
	int ret = check_sys();
	if (ret == 1)
	{
		printf("小\n");
	}
	else
	{
		printf("大\n");
	}

	return 0;
}
使用联合体
int check_sys()
{
	union Un
	{
		char c;
		int i;
	}u;//此处可以像结构体一样,创建一个全局的联合体变量
	u.i = 1;
	return u.c;//返回的是第一个字节
}

int main()
{
	int ret = check_sys();
	if (ret == 1)
	{
		printf("小\n");
	}
	else
	{
		printf("大\n");
	}

	return 0;
}

联合体的大小

下面这段代码的运行结果是:

union Un
{
	int a;
	char arr[5];

};

int main()
{
	union Un u;
	printf("%zd\n", sizeof(u));

	return 0;
}

计算联合体大小的规则

联合体的大小至少是最大成员的大小(类似结构体)

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

数组的对齐数:用其中一个元素的大小来和默认值比较

由上可知,4+1+3 == 8,结果是8

结语

自定义数据类型的知识介绍到这里就结束了,感觉收获很多呢

之后我利用已经学会的知识来尝试去实现通讯录,我们下篇文章见~

  • 8
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
C语言中,结构体是一种自定义数据类型,可以将不同类型的变量组合在一起,形成一个新的数据类型。结构体定义的基本形式如下: ```c struct 结构体名 { 数据类型 成员名1; 数据类型 成员名2; // ... }; ``` 其中,结构体名是用户自定义的名称,成员名是结构体中每个成员的名称,数据类型可以是任意C语言数据类型,包括基本数据类型自定义数据类型。 结构体变量的定义方式如下: ```c struct 结构体名 变量名; ``` 读取结构体中的成员变量可以通过“.”运算符来实现,例如: ```c #include <stdio.h> struct Person { char name[20]; int age; }; int main() { struct Person p; printf("请输入姓名:"); scanf("%s", p.name); printf("请输入年龄:"); scanf("%d", &p.age); printf("姓名:%s,年龄:%d\n", p.name, p.age); return 0; } ``` 枚举是一种特殊的数据类型,用于定义一组常量。枚举的定义方式如下: ```c enum 枚举名 { 常量名1, 常量名2, // ... }; ``` 其中,枚举名是用户自定义的名称,常量名是枚举中每个常量的名称。枚举常量的值默认是从0开始自动递增的,也可以手动指定值。例如: ```c #include <stdio.h> enum Weekday { Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday }; int main() { enum Weekday today = Tuesday; printf("今天是星期%d\n", today + 1); return 0; } ``` 联合是一种特殊的数据类型,它的成员变量共享同一块内存空间。联合的定义方式如下: ```c union 联合名 { 数据类型 成员名1; 数据类型 成员名2; // ... }; ``` 其中,联合名是用户自定义的名称,成员名是联合中每个成员的名称,数据类型可以是任意C语言数据类型,但所有成员的大小不能超过联合的大小。例如: ```c #include <stdio.h> union Number { int i; float f; }; int main() { union Number n; n.i = 123; printf("int: %d, float: %.2f\n", n.i, n.f); n.f = 3.14; printf("int: %d, float: %.2f\n", n.i, n.f); return 0; } ``` 以上就是C语言自定义数据类型中的结构体、枚举、联合的基本用法和注意事项。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值