这是我参与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);
}
复制代码