📜  C中结构和联合的区别(1)

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

C中结构和联合的区别

在C语言中,结构和联合是两个重要的数据类型。两者都可以用来描述多个不同类型的数据,但是它们具有不同的特点和使用场景。

结构体

结构体是一种用户自定义的数据类型,可以将多个不同类型的数据组合在一起,形成一个单独的实体。在结构体中,每个数据成员都可以有不同的数据类型,例如:

struct person {
   char name[50];
   int age;
   double height;
};

上面的代码定义了一个名为person的结构体,包含了一个字符数组name、一个整数age和一个双精度浮点数height。我们可以使用person作为一个单独的实体来访问它的成员变量,例如:

struct person teacher = {"Tom", 35, 1.75};
printf("Teacher's name: %s, age: %d, height: %f", teacher.name, teacher.age, teacher.height);

结构体可以嵌套使用,例如:

struct point {
    int x;
    int y;
};

struct rectangle {
    struct point top_left;
    struct point bottom_right;
};

上面的代码定义了两个结构体pointrectangle,其中rectangle中嵌套了point。这种嵌套结构体的方式可以让我们更清晰地描述出复杂数据。

联合体

联合体与结构体类似,也可以将多个不同类型的数据组合在一起,但是联合体的所有成员共用同一块内存空间。在联合体中,数据成员不能同时存在于内存中,只有最后一次赋值的成员才能在内存中存在,例如:

union data {
   int i;
   float f;
   char str[20];
};

union data d;
d.i = 10;
printf("%d\n", d.i);
d.f = 3.14;
printf("%f\n", d.f);
strcpy(d.str, "hello");
printf("%s\n", d.str);

上面的代码定义了一个名为data的联合体,包含了一个整数i、一个浮点数f和一个字符数组str。我们可以通过给某个成员变量赋值来访问它们的成员,但是在访问某个成员后,所有成员的值都会发生变化。

由于联合体的所有成员使用同一块内存,所以它通常用于处理相对简单的数据类型转换问题,或者在嵌入式系统中尽量减小内存使用。

总结

结构体和联合体都可以用于组合不同类型的数据,但是它们有不同的使用场景:

  • 结构体适用于组合较为复杂的数据,例如由不同类型的数据组成的对象。
  • 联合体适用于一次只使用一个数据成员的场合,或者在内存使用量较小的环境下使用。