结构体与联合体的区别

17 Mar 2025 | 6 分钟阅读

结构体 (Structure)联合体 (Union) 都是 C/C++ 编程语言中的用户定义数据类型。在本节中,我们将了解结构体和联合体是什么;以及它们之间的区别。

Structure vs Union

什么是结构体 (struct)?

结构体 (struct) 是编程语言中的一种用户定义数据类型,它将不同数据类型的值存储在一起。struct 关键字用于在程序中定义结构体数据类型。结构体数据类型在变量中存储一个或多个不同类型的数据元素。

假设您想在 C/C++ 项目中存储员工数据,您需要存储以下不同的参数

  • ID
  • 名称
  • 部门
  • 电子邮件地址

存储 4 个不同数据的**一种方法**是为每个参数创建 4 个不同的数组,例如 id[]、name[]、department[] 和 email[]。使用数组 id[i] 表示第 i 名员工的 ID。同样,name[i] 表示第 i 名员工的姓名。数组元素 department[i] 和 email[i] 表示第 i 名员工的部门和电子邮件地址。

为每个参数使用单独数组的优点是,如果只有几个参数,它很简单。这种逻辑的缺点是管理员工数据相当困难。试想一下,您需要处理与一名员工相关的 100 个甚至更多的参数。管理 100 个甚至更多的数组并不容易。在这种情况下,就轮到 struct 了。

结构体的语法

示例

什么是联合体?

在 “c” 编程中,联合体 (union) 是一种用户定义的数据类型,用于存储不同数据类型的值。但是,在联合体中,一次只有一个成员占用内存。换句话说,我们可以说联合体的大小等于其最大数据成员的大小。联合体通过每个数据成员提供了一种有效地多次使用同一内存位置的方法。union 关键字用于定义和创建联合体数据类型。

联合体的语法

示例

C 语言中结构体和联合体的示例,展示了它们之间的区别

让我们看一个 C 语言中结构体 (struct) 和联合体 (union) 的示例,来说明它们之间的各种区别。

输出

data of structure:
 integer: 5
 decimal: 15.00
 name: John

data of union:
 integer: 5
decimal: 0.00
 name: 

Accessing all members at a time:
data of structure:
 integer: 163
 decimal: 75.000000
 name: John

data of union:
 integer: 1852337994
 decimal: 17983765624912253034071851008.000000
 name: John

Accessing one member at a time:
data of structure:
integer: 140
decimal: 150.000000
name: Mike
data of union:
integer: 1701538125
decimal: 69481161252302940536832.000000
name: Mike
Altering a member value:
data of structure:
 integer: 512
 decimal: 150.00
 name: Mike
data of union:
 integer: 512
 decimal: 0.00
 name: 

sizeof structure: 28
sizeof union: 20

结构体与联合体的区别

让我们以表格形式总结上面讨论过的关于结构体和联合体的主题,该表格重点介绍了结构体和联合体之间的区别

结构体并集
struct 关键字用于定义结构体。union 关键字用于定义联合体。
当在结构体中声明变量时,编译器会为每个变量成员分配内存。结构体的大小等于或大于所有数据成员大小的总和。当在联合体中声明变量时,编译器会为最大尺寸的变量成员分配内存。联合体的大小等于其最大数据成员的大小。
每个变量成员都占用唯一的内存空间。变量成员共享最大尺寸变量的内存空间。
更改一个成员的值不会影响其他变量成员。更改一个成员的值也会影响其他变量成员。
任何时候都可以访问每个变量成员。任何时候只能访问一个变量成员。
我们可以一次性初始化结构体的多个变量。在联合体中,只能初始化第一个数据成员。
在程序的任何时候,所有变量成员都存储一些值。在程序的任何特定实例中,只有一位数据成员存储一个值。
结构体允许一次初始化多个变量成员。联合体一次只允许初始化一个变量成员。
它用于存储不同数据类型的值。它用于一次性存储不同数据类型中的一个值。
它允许在任何时候访问和检索任何数据成员。它允许在任何时候访问和检索其中一个数据成员。

结构体的比较优缺点

以下是使用结构体的一些优缺点列表

结构体的优点

  • 结构体将同一个对象的多个不同数据类型的值存储在一起。
  • 当您想存储同一个对象的不同或相似数据类型(如姓名、地址、电话等)时,它很有用。
  • 它使得维护整个记录变得非常容易,因为我们使用单个名称来表示完整的记录。
  • 结构体允许通过单个参数将一整组记录传递给任何函数。
  • 还可以创建结构体数组来存储多个相似数据类型的多条数据。

结构体的缺点

  • 如果项目复杂度增加,管理所有数据成员会变得困难。
  • 更改程序中的一个数据结构需要更改其他几个地方。因此,跟踪所有更改变得困难。
  • 结构体需要更多的存储空间,因为它为所有数据成员分配内存,甚至速度也更慢。
  • 结构体占用更多存储空间,因为它为所有不同的数据成员分配内存,而联合体仅占用最大数据大小参数所需的内存大小,并且相同的内存与其他数据成员共享。

联合体的比较优缺点

以下是使用联合体的一些优缺点列表

联合体的优点

  • 与结构体相比,联合体占用的内存空间更少。
  • 使用联合体时,只能直接访问最大尺寸的数据成员。
  • 当您希望为不同的数据成员使用更少的(相同的)内存时,可以使用它。
  • 它为所有数据成员分配内存大小,以其最大数据成员的大小为准。

联合体的缺点

  • 它一次只允许访问一个数据成员。
  • 联合体为其所有数据成员分配一个单一的公共内存空间,这些空间由它们共享。
  • 并非所有联合体数据成员都已初始化,并且它们在同一时间通过交换值来使用。

下一主题区别