📜  C语言中的结构和联合之间的区别(1)

📅  最后修改于: 2023-12-03 15:00:13.898000             🧑  作者: Mango

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

在 C 语言中,结构(Structure)和联合(Union)是两种非常重要的数据类型,它们都可以用于存储多个不同数据类型的值。然而,它们之间还是有很大的区别的。

结构(Structure)
定义

结构是一种用户自定义的数据类型,它允许我们将不同类型的变量组合成一个整体,这个整体被称为结构体(Structure)。定义结构体的语法如下:

struct 结构体名
{
    数据类型 成员变量1;
    数据类型 成员变量2;
    //...
};

例如,我们可以定义一个表示学生信息的结构体:

struct Student
{
    char name[20];
    int age;
    float score;
};
特点

结构体有以下特点:

  • 一个结构体可以包含多个成员变量,成员变量之间是相互独立、互不干扰的。
  • 结构体的成员变量可以是任意数据类型,例如基本数据类型、数组、指针、甚至是其他结构体类型等。
  • 结构体在内存中的存储方式是连续的,也就是说它占用的内存大小是所有成员变量占用内存大小的和,因而会浪费一定的空间。
示例

我们可以定义一个结构体数组来存储多个学生的信息:

#include <stdio.h>

struct Student
{
    char name[20];
    int age;
    float score;
};

int main()
{
    struct Student students[3] = {{"Alice", 18, 85.5},
                                   {"Bob", 20, 76.0},
                                   {"Charlie", 19, 92.5}};
    for (int i = 0; i < 3; i++)
    {
        printf("Name: %s, Age: %d, Score: %.1f\n", students[i].name, students[i].age, students[i].score);
    }
    return 0;
}

输出结果为:

Name: Alice, Age: 18, Score: 85.5
Name: Bob, Age: 20, Score: 76.0
Name: Charlie, Age: 19, Score: 92.5
联合(Union)
定义

联合是一种特殊的结构体,它与结构体的定义形式类似,不同之处在于联合体(Union)只能同时存储一个成员变量的值。定义联合体的语法如下:

union 联合体名
{
    数据类型 成员变量1;
    数据类型 成员变量2;
    //...
};

例如,我们可以定义一个能够同时存储浮点数、整数和字符型的联合体:

union Variant
{
    float f;
    int i;
    char c;
};
特点

联合体有以下特点:

  • 联合体中的所有成员变量共享同一块内存空间,占用的内存大小为其最大成员变量占用内存大小。
  • 改变联合体中某一个成员变量的值,会影响到其他成员变量的值。这是因为它们实际上是覆盖着同一块内存。
  • 只有一个成员变量能够被同时使用,因此联合体常常用于节省内存或者在不同的情况下使用不同类型的数据。
示例

我们通过一个程序来说明联合的使用方法:

#include <stdio.h>

union Variant
{
    float f;
    int i;
    char c;
};

int main()
{
    union Variant v;
    v.f = 3.14;
    printf("v.f = %.2f, v.i = %d, v.c = '%c'\n", v.f, v.i, v.c);
    v.i = 1024;
    printf("v.f = %.2f, v.i = %d, v.c = '%c'\n", v.f, v.i, v.c);
    v.c = 'A';
    printf("v.f = %.2f, v.i = %d, v.c = '%c'\n", v.f, v.i, v.c);
    return 0;
}

输出结果为:

v.f = 3.14, v.i = 1078523331, v.c = '\x8d'
v.f = 0.00, v.i = 1024, v.c = '\x00'
v.f = 65.00, v.i = 1090519040, v.c = 'A'
结构和联合间的区别

结构和联合之间的最大区别在于内存的分配方式和使用方式:

  • 结构体成员变量之间是相互独立、互不干扰的,因此占用的内存大小等于所有成员变量占用内存大小之和。
  • 联合体成员变量共享同一块内存空间,因此占用的内存大小等于其最大成员变量占用内存大小。
  • 结构体可以同时存储多个成员变量的值,不同成员变量之间不会发生冲突。
  • 联合体只能同时存储一个成员变量的值,改变其中一个成员变量的值会影响到其他成员变量的值。

因此,当我们需要同时存储多个不同类型的值时,应该使用结构体;当我们需要在不同条件下使用不同类型的数据时,或者需要节省内存空间时,应该使用联合体。

总结

结构体和联合体是 C 语言中两种非常重要的数据类型,它们本质上都是用于将不同类型的变量组合在一起的。通过对结构体和联合体的学习,我们可以更好地理解 C 语言中的复合数据类型,进而写出更加高效、简洁的代码。