开始接触 c++ 了— struct 和 union

这是我参与2022首次更文挑战的第26天,活动详情查看:2022首次更文挑战

希望我们的 c++ 分享做的有趣且全面,上一次分享了 struct 这一次来介绍 union,在开始介绍 union 之前我们先简单回顾一下 struct ,随后还会介绍他们共同之处以及有那些差异,好开始吧,一切从简单开始。

#include <stdio.h>
#include <stdbool.h>

int main()
{

}
复制代码

可能更偏向这种方式来定义 struct 通过 typedef 然后紧接着一个匿名 struct 虽然给这个 struct 一个名称

typedef struct {
	int x;
	float y;
	char z;
} mystruct;
复制代码

创建一个 union 和创建一个 struct 非常类似

typedef union {
	int x;
	float y;
	char z;
} mynuion;

复制代码
int main()
{
	printf("struct size: %lu\n", sizeof(mystruct));
	printf("union size: %lu\n", sizeof(mynuion));
}
复制代码

通过打印 mystruct 和 myunion 的大小不难发现,给 struct 分配的内存大小其所有成员所在内存大小总和,而对于 union 仅是其中一个成员所占内存的大小

顺便介绍两个 visual studio 两个实用的快捷键 ctrl + D 复制一行,alt + 方向键来上下移动

struct size: 12
union size: 4
复制代码

接下来我们用通常数据来实例化 struct 和 union 然后将其成员分别输出,来看一下他们不同之处

int main()
{
	mystruct s;
	s.x = 2;
	s.y = 3.1;
	s.z = 'Z';


	myunion u;
	u.x = 2;
	u.y = 3.1;
	u.z = 'Z';


	printf("struct size: %lu\n", sizeof(mystruct));
	printf("{%d, %f, %c}\n", s.x, s.y, s.z);
	printf("union size: %lu\n", sizeof(myunion));
	printf("{%d, %f, %c}\n", u.x, u.y, u.z);
}
复制代码

通过下面输出结果来看,很明显 union 除了 Z 保持了原样,之前赋值 x 和 y 都发生变换,因为每一次赋值时因为 union 只有一个内存空间所以会覆盖之前内容,既然这样我们还为什么需要 union 呢,下面就通过一个例子给大家解释一下。

struct size: 12
{2, 3.100000, Z}
union size: 4
{1078355546, 3.099997, Z}
复制代码

定义 tut 结构体,这个 tut 结构体有两种类型,可以是视频 tut 也可以是文本的 tut,通过 isVideo 来加以区分,当是视频 tut 就有 level 等级区分是短视频还是长视频,而是文本,需要有 description 属性,也就是 description 和 level 分别属于不同类别

typedef struct {
	char* title;
	bool isVideo;
	char* description;
	int level
} tut;
复制代码

这时候 union 就派上用场,因为 struct 每一次实例化都只能是文本或者视频的一种,而且 description 和 level 分别属于不同类型,所以我们可以用 union 其他特有性质来解决这个问题,如下

typedef struct {
	char* title;
	bool isVideo;
	union
	{
		char* description;
		int level;
	};
} tut;

void print_tut(tut* t)
{
	printf("Tut: %s " t->title);
	if ( t->isVideo) {
		printf("video tut %i", t->level);
	}
	else
	{
		printf(" tut %c", t->description);

	}

}
复制代码

接下来我们把完整代码展示一下


typedef struct {
	char* title;
	bool isVideo;
	union
	{
		char* description;
		int level;
	};
} tut;

void print_tut(tut* t)
{
	printf("Tut: %s\n",t->title);

	if ( t->isVideo) {
		printf("video tut %i\n", t->level);
	}
	else
	{
		printf(" tut %c\n", t->description);

	}

}

int main()
{
	mystruct s;
	s.x = 2;
	s.y = 3.1;
	s.z = 'Z';


	myunion u;
	u.x = 2;
	u.y = 3.1;
	u.z = 'Z';


	//printf("struct size: %lu\n", sizeof(mystruct));
	//printf("{%d, %f, %c}\n", s.x, s.y, s.z);
	//printf("union size: %lu\n", sizeof(myunion));
	//printf("{%d, %f, %c}\n", u.x, u.y, u.z);

	tut machineLearningTut;
	tut deepLearnTut;

	machineLearningTut.title = "machine learning";
	machineLearningTut.isVideo = false;
	machineLearningTut.description = "machine learning ";

	deepLearnTut.title = "deep learning";
	deepLearnTut.isVideo = true;
	deepLearnTut.level = 1;

	print_tut(&machineLearningTut);
	print_tut(&deepLearnTut);
}
复制代码

猜你喜欢

转载自juejin.im/post/7068958634188734494
今日推荐