C语言中结构体和联合体的区别

什么是结构体?

结构体是C编程语言中一种用户定义的数据类型,它将逻辑上相关的、不同数据类型的多个数据项组合在一起。

所有结构体成员都存储在连续的内存位置。结构体类型的变量可以在一个名称下存储不同数据类型的多个数据项。

什么是联合体

联合体是一种用户定义的数据类型,与结构体类似。联合体将不同类型和大小的对象组合在一起。联合体变量分配的内存空间等于容纳联合体中最大变量的空间。它允许不同类型的数据项共享同一内存位置。

结构体的声明语法

struct [name of the structure]
   {
       type member1;
       type member2;
       type member3;
   };

结构体使用“struct”关键字和结构体名称声明。数字1、数字2、数字3是结构体的各个成员。主体部分以分号(;)结尾。

C语言结构体示例

#include <stdio.h>
struct student {
    char name[60];
    int roll_no;
    float marks;
} sdt;
int main() {
    printf("Enter the following information:\n");
    printf("Enter student name: ");
    fgets(sdt.name, sizeof(sdt.name), stdin);
    printf("Enter student roll number: ");
    scanf("%d", & sdt. roll_no);
    printf("Enter students marks: ");
    scanf("%f", & sdt.marks);
    printf("The information you have entered is: \n");
    printf("Student name: ");
    printf("%s", sdt.name);
    printf("Student roll number: %d\n", sdt. roll_no);
    printf("Student marks: %.1f\n", sdt.marks);
    return 0;
}

在上面的程序中,创建了一个名为student的结构体。该结构体包含三个数据成员:1)name(字符串),2)roll_no(整数),3)marks(浮点数)。

之后,创建了一个名为sdt的结构体变量来存储学生信息并在计算机屏幕上显示。

输出

请输入以下信息

请输入学生姓名:James

请输入学生学号:21

请输入学生成绩:67

您输入的信息是

学生姓名:John

学生学号:21

学生成绩:67.0

联合体的声明语法

union [name of union]
    {
       type member1;
       type member2;
       type member3;
    };

联合体使用“union”关键字和联合体名称声明。数字1、数字2、数字3是联合体的各个成员。主体部分以分号(;)结尾。

C语言联合体示例

#include <stdio.h>

union item
{
    int x;
    float y;
    char ch;
};

int main( )
{
    union item it;
    it.x = 12;
    it.y = 20.2;
    it.ch = 'a';
    
    printf("%d\n", it.x);
    printf("%f\n", it.y);
    printf("%c\n", it.ch);
    
    return 0;
}

输出

1101109601

20.199892

a

在上面的程序中,您可以看到x和y的值已损坏。只有变量ch打印出预期的结果。这是因为,在联合体中,内存位置由所有成员数据类型共享。

因此,当前存储的唯一数据成员将占用内存空间。变量ch的值最后存储,因此其余变量的值丢失了。

结构体与联合体的区别

Structure Vs. Union
结构体与联合体的区别

以下是结构体和联合体之间的重要区别

结构体 联合
您可以使用struct关键字定义结构体。 您可以使用union关键字定义联合体。
结构体中的每个成员都被分配一个唯一的内存位置。 在联合体中,所有数据成员共享一个内存位置。
更改一个数据成员的值不会影响结构体中的其他数据成员。 更改一个数据成员的值会改变联合体中其他数据成员的值。
它允许您一次初始化多个成员。 它只允许您初始化联合体的第一个成员。
结构体的总大小是每个数据成员大小的总和。 联合体的总大小是最大数据成员的大小。
它主要用于存储各种数据类型。 它主要用于存储可用数据类型中的一种。
它为内部参数中写入的每个成员占用空间。 它为内部参数中写入的具有最大尺寸的成员占用空间。
您可以随时检索任何成员。 您可以在联合体中一次访问一个成员。
它支持柔性数组。 它不支持柔性数组。

结构体的优点

以下是使用结构体的优点/好处

  • 结构体将关于同一主题的多个数据聚集在同一个地方。
  • 当您想收集相似数据类型和参数(如名字、姓氏等)的数据时,它很有用。
  • 维护起来非常容易,因为我们可以使用单个名称来表示整个记录。
  • 在结构体中,我们可以通过单个参数将整个记录集传递给任何函数。
  • 您可以使用结构体数组来存储更多具有相似类型的记录。

联合体的优点

以下是使用联合体的优点/好处

  • 与结构体相比,它占用的内存更少。
  • 当您使用联合体时,只能直接访问最后一个变量。
  • 当您需要为两个或更多数据成员使用相同的内存位置时,就会使用联合体。
  • 它只允许您存储一个数据成员的数据。
  • 其分配的空间等于数据成员的最大大小。

结构体的缺点

以下是使用结构体的缺点/弊端

  • 如果IT项目的复杂性超出限制,则难以管理。
  • 更改代码中的一个数据结构会需要更改许多其他地方。因此,更改难以追踪。
  • 结构体速度较慢,因为它需要为所有数据分配存储空间。
  • 您可以在结构体中随时检索任何成员,而在联合体中,您一次只能访问一个成员。
  • 结构体为内部参数中写入的每个成员占用空间,而联合体为内部参数中写入的具有最大尺寸的成员占用空间。
  • 结构体支持柔性数组。联合体不支持柔性数组。

联合体的缺点

以下是使用联合体的缺点/弊端

  • 您一次只能使用一个联合体成员。
  • 所有联合体变量不能一次性初始化或使用不同的值。
  • 联合体为其所有成员分配一个公共存储空间。

主要区别

  • 结构体中的每个成员都被分配一个唯一的内存位置,而在联合体中,所有数据成员共享一个内存位置。
  • 更改结构体中一个数据成员的值不会影响其他数据成员,而在联合体中,更改一个数据成员的值会改变其他数据成员的值。
  • 结构体主要用于存储各种数据类型,而联合体主要用于存储多种数据类型中的一种。
  • 在结构体中,您可以随时检索任何成员,而在联合体中,您一次只能访问一个成员。
  • 结构体支持柔性数组,而联合体不支持柔性数组。

也请查看我们的C教程(适合初学者):点击这里