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

什么是结构?

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

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

什么是 Union

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

声明结构的语法

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

您输入的信息是:

学生姓名:约翰

学生人数:21

学生成绩:67.0

声明 Union 的语法

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

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

C 编程中的 Union 示例

#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 打印了预期的结果。这是因为在 union 中,内存位置在所有成员数据类型之间共享。

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

结构与联盟

结构与联盟
结构与联盟

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

结构 工会
您可以使用 struct 关键字来定义结构。 您可以使用 union 关键字来定义联合。
结构内的每个成员都被分配一个唯一的内存位置。 在联合中,所有数据成员共享一个内存位置。
改变一个数据成员的值不会影响结构中的其他数据成员。 改变一个数据成员的值将会改变联合中其他数据成员的值。
它使您能够一次初始化多个成员。 它使您能够仅初始化联合的第一个成员。
结构的总大小是每个数据成员的大小之和。 联合的总大小是最大数据成员的大小。
主要用于存储各种数据类型。 它主要用于存储可用的多种数据类型之一。
它占用了内部参数中写入的每个成员的空间。 它占用内部参数中写入的最大尺寸成员的空间。
您一次可以检索任何成员。 您每次可以访问联合中的一位成员。
它支持灵活阵列。 它不支持灵活数组。

结构优势

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

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

工会的优势

以下是使用 union 的优点/好处:

  • 与结构相比,它占用的内存更少。
  • 使用联合时,只有最后一个变量可以被直接访问。
  • 当必须对两个或多个数据成员使用相同的内存位置时,使用联合。
  • 它使您能够仅保存一个数据成员的数据。
  • 其分配的空间等于数据成员的最大大小。

结构缺点

以下是使用结构的缺点/缺点:

  • 如果IT项目的复杂性超出了限制,就会变得难以管理。
  • 代码中一个数据结构的改变会引发很多其他地方的改变。因此,这些变化很难追踪。
  • 结构较慢,因为它需要存储所有数据的空间。
  • 您可以在结构中一次检索任何成员,而在联合中一次只能访问一个成员。
  • 结构占用内部参数中写入的每个成员的空间,而联合占用内部参数中写入的最大大小的成员的空间。
  • 结构支持灵活数组。联合不支持灵活数组。

工会的弊端

以下是使用 union 的缺点/缺点:

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

主要区别:

  • 结构中的每个成员都分配有一个唯一的内存位置,而联合体中的内存位置由所有数据成员共享。
  • 改变一个数据成员的值不会影响结构中的其他数据成员,而改变一个数据成员的值将会改变联合中其他数据成员的值。
  • 结构主要用于存储各种数据类型,而联合主要用于存储多种数据类型中的一种。
  • 在结构中,您可以一次检索任何成员;另一方面,在联合中,您可以一次访问一个成员。
  • 结构支持灵活数组,而联合不支持灵活数组。

另请查看我们的 C 语言初学者教程:- 了解更多