C 语言结构体和联合体概述

17 Mar 2025 | 6 分钟阅读

结构体和联合体是 C 语言中许多用户定义数据类型中的两种。它们之间有很多相似之处,但也存在一些显著的差异。在本文中,我们将讨论这两种数据类型,并根据功能区分它们。

结构体 (STRUCTURES)

结构体可以简单地定义为一种用户定义的数据类型,它将逻辑上相关的项组合成一个单一的单元。我们可以通过访问这个单一单元来使用所有不同的数据项。

所有数据项都存储在连续的内存位置中。这不仅仅允许存储单一数据类型项,还可以存储不同数据类型项。在使用它(就像在程序中使用变量之前必须先定义变量一样)之前,必须先定义结构体。

结构体定义语法

示例

假设我们需要存储员工的详细信息。这包括 ID、姓名、年龄、薪水、职位以及其他属于不同数据类型的几个因素。

内存空间分配

假设我们存储了 id。它存储在某个地址,比如 8000,由于它是 int 数据类型,需要 2 个内存单元。现在,下一个项,name,紧跟在 id 后面存储在 8002。同样,所有项都连续存储。

8000 -> emp_id (2 字节)

8002 -> name[20] (20*1 = 20 字节)

8022 -> salary (4 字节)

8026 -> designation[50] (50*1 = 50 字节)

8076 ->dept_no (2 字节)

8078 -> age (2 字节)

示例程序

输出

Size of the structure: 14

需要注意的点

此处,

结构体 'S' 的大小 = sizeof(roll) + sizeof(name) + sizeof(mark)

= 2 + 10 + 2 = 14

访问结构体的成员

我们不能在定义时初始化结构体,也不能仅仅通过名称访问成员。在定义结构体后,我们需要定义该结构体数据类型的变量。

现在,我们使用这个变量通过特殊运算符 (.) 来访问结构体中的项。下面是一个例子;

e1 现在是结构体变量。

访问结构体中的数据项

  • name
  • salary
  • emp_id
  • 地址
  • dept_no

这是另一个例子

另一种方法

示例程序

输出

Roll no : 110
Name : Sarika
Marks : 568

//2. 从用户输入

输出

Enter the name of the student: Sagari
Enter his/her roll number: 6
Enter his/her marks: 780
Displaying the information:
Name: Sagari
Roll number: 6
Marks: 780

将一个结构体赋值给另一个结构体

我们可以将一个完整的结构体赋值给另一个。如果我们这样做,我们可以通过另一个结构体的变量来访问一个结构体的成员,反之亦然。

假设 e1 和 e2 分别是两个结构体 Emp1 和 Emp2 的变量。如果我们给 e1 赋值 e2

现在,结构体 Emp2 的每个成员的值都被赋给了 Emp1 的相应成员。

结构体数组

它用于一次性存储大量相似的信息。在这里,我们不使用普通变量,而是将一个数组用作结构体变量。现在,我们可以存储更多信息。

语法

实施

输出

Enter detailsof the Employee
        Enter Employee Id : 1
        Enter Employee Name : Ravi
        Enter Employee Age : 21
        Enter Employee Salary : 23000

Enter detailsof the Employee
        Enter Employee Id : 2
        Enter Employee Name : Rajesh
        Enter Employee Age : 32
        Enter Employee Salary : 67890

Enter detailsof the Employee
        Enter Employee Id : 3
        Enter Employee Name : Kiran
        Enter Employee Age : 34
        Enter Employee Salary : 23435
Details of Eloyees
1       Ravi    21      23000
2       Rajesh  32      67890
3       Kiran   34      23435

结构体嵌套结构体

我们可以将一个结构体定义为另一个结构体的变量。通过这样做,我们可以为结构体的关键成员创建一个单独的块,用于存储更准确、更清晰的信息。

语法

在这里,我们使用了变量 doj,它是另一个结构体,并将其包含在结构体 date 中。通过这样做,我们可以了解确切的日期、月份和年份,从而提高可读性和信息量。

要访问这些成员,

访问嵌套在另一个结构体中的结构体的语法是

示例

在上面的例子中

e1.doj.day; -> 用于 date 中的 day

e1.doj.month; -> 用于 date 中的 month

e1.doj.year; -> 用于 month 中的 year

完整程序示例

输出

employee id : 101
employee date of joining (dd/mm/yyyy) : 10-11-2014

UNION

就像结构体一样,联合体也是一种用户定义的数据类型,它将逻辑上相关的变量组合成一个单一的单元。

几乎所有的属性和语法都相同,除了某些因素。

语法

示例

联合体的内存分配

Overview of Structures and Unions in C

在结构体中,它占用的内存是其所有成员占用的内存之和,因为它们是连续组织的,每个成员都有自己的内存。

但是,在联合体中,数据项是按顺序堆叠的。因此,存储联合体所需的总内存空间是其中最大内存项所需的内存。

另一个主要的区别是,在结构体中,我们可以随时访问任意数量的项。但在联合体中,一次只能访问一个项。

这里有一个表格来区分结构体和联合体之间的所有因素

结构联合体 (Unions)
"struct" 关键字用于定义结构体。"union" 关键字用于定义联合体。
结构体的每个成员都有一个唯一的内存位置。所有成员共享一个内存位置。
修改一个项的值不会影响其他项或结构体本身。修改一个数据项会影响联合体的其他成员,从而影响整个单元。
我们可以一次性初始化多个成员。我们只能初始化联合体的第一个成员。
结构体的总大小是每个数据成员大小的总和。联合体的总大小是最大数据成员的大小。
主要用于存储各种数据类型。主要用于存储多种可用数据类型中的一种。
它为内部参数中写下的每个成员都分配空间。它只为内部参数中写下的、尺寸最大的成员分配空间。
我们可以随时检索任何成员。在联合体中,我们一次只能访问一个成员。