30 结构体与共用体之共用体的定义与使用

在上一篇中,我们详细介绍了结构体的定义与使用。现在,我们将深入探讨共用体(Union),它是一种特殊的数据结构,允许你在同一内存位置存储不同的数据类型。共用体的应用场景使它们在节省内存时尤其有用,但是这也意味着您需要对其使用给予更高的关注。

共用体的定义

共用体的基本定义与结构体相似,但有几个关键区别。一个共用体可以定义多个成员,但所有成员都共享同一段内存。这意味着在任何时刻,共用体只能存储一个成员的值。

共用体的语法

共用体的定义语法如下:

1
2
3
4
5
6
union UnionName {
dataType1 member1;
dataType2 member2;
dataType3 member3;
// 其他成员
};

示例

下面是一个共用体的简单例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <stdio.h>
#include <string.h>

// 定义一个共用体
union Data {
int i;
float f;
char str[20];
};

int main() {
union Data data;

// 使用 int 类型
data.i = 10;
printf("data.i: %d\n", data.i);

// 使用 float 类型
data.f = 220.5;
printf("data.f: %.2f\n", data.f);

// 使用 char 数组
strcpy(data.str, "Hello");
printf("data.str: %s\n", data.str);

// 如果打印其他类型,将得到未定义的值
printf("data.i: %d\n", data.i); // 未定义值
printf("data.f: %.2f\n", data.f); // 未定义值

return 0;
}

输出结果

这个程序的输出结果如下:

1
2
3
4
5
data.i: 10
data.f: 220.50
data.str: Hello
data.i: -223334287
data.f: 0.00

在这个例子中,我们定义了一个名为 Data 的共用体,并通过 data 变量使用它。注意,共用体的各个成员共享同一段内存,因此最后一次赋值会覆盖之前的内容。使用共用体时需小心,以确保只使用当前有效的成员。

共用体的内存占用

共用体的大小由最大成员的大小决定。例如,在上述示例中:

  • int 大小通常为 4 字节
  • float 大小通常为 4 字节
  • char[20] (字符串)大小为 20 字节

因此,union Data 的大小为 20 字节。

您可以使用 sizeof 操作符来查看共用体的大小:

1
printf("Size of union Data: %zu bytes\n", sizeof(data));

共用体的应用场景

共用体通常在以下情况中使用:

  1. 节省内存:当你知道某个变量在特定时间只会使用其中一个数据类型时,使用共用体是个好的选择。
  2. 数据类型转换:通过共用体,你可以容易地将一个数据类型的值“转化”为另一个类型的值。虽然这需要谨慎处理,但在某些情况下非常有效。

实际案例

下面是一个更复杂的示例,显示如何用共用体实现一个简单的多类型数据存储:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <stdio.h>

union Value {
int intValue;
float floatValue;
char charValue;
};

struct Variable {
enum { INT, FLOAT, CHAR } type;
union Value value;
};

void printVariable(struct Variable v) {
switch (v.type) {
case INT:
printf("Integer: %d\n", v.value.intValue);
break;
case FLOAT:
printf("Float: %.2f\n", v.value.floatValue);
break;
case CHAR:
printf("Character: %c\n", v.value.charValue);
break;
}
}

int main() {
struct Variable v1;
v1.type = INT;
v1.value.intValue = 5;

struct Variable v2;
v2.type = FLOAT;
v2.value.floatValue = 3.14;

struct Variable v3;
v3.type = CHAR;
v3.value.charValue = 'A';

printVariable(v1);
printVariable(v2);
printVariable(v3);

return 0;
}

输出结果

这个程序的输出结果如下:

1
2
3
Integer: 5
Float: 3.14
Character: A

在这个示例中,使用 Variable 结构体结合 Value 共用体实现了一个可以存储多种类型值的系统。我们通过 enum 类型来标识当前存储的数据类型,从而安全地打印出对应的值。

小结

共用体是在 C 语言中实现内存有效使用的重要工具,与结构体相比,它们提供了更大的灵活性,但也需要更小心的管理。合理使用共用体可以极大地提高程序的效率与性能。

接下来,我们将继续探讨下一个话题:结构体与共用体之枚举类型的使用。在那篇文章中,我们将讨论如何结合枚举和结构体,把数据组织得更清晰易懂。希望你能继续关注!

30 结构体与共用体之共用体的定义与使用

https://zglg.work/cplusplus-zero/30/

作者

IT教程网(郭震)

发布于

2024-08-10

更新于

2024-08-10

许可协议

分享转发

交流

更多教程加公众号

更多教程加公众号

加入星球获取PDF

加入星球获取PDF

打卡评论