📜  C |结构与联合|问题4(1)

📅  最后修改于: 2023-12-03 14:39:40.950000             🧑  作者: Mango

C语言结构体与联合体问题

在C语言中,结构体和联合体都可以用来定义复杂的变量类型。它们都是一种用户自定义的数据类型,能够将不同的数据类型组合在一起。但是它们之间还是有一些区别的。

结构体

结构体是由多个不同数据类型的成员组成的数据类型,每个成员有自己的名称和数据类型。结构体中的成员在内存中是按照定义的顺序依次排列的,每个成员占用的内存空间是连续的。

定义结构体的语法如下:

struct struct_name
{
    data_type member1;
    data_type member2;
    ...
    data_type member_n;
};

其中,struct_name是结构体名称,member是结构体成员名,data_type是成员的数据类型。

下面是一个示例:

#include <stdio.h>

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

int main()
{
    struct student s = {"Tom", 18, 90.5};
    printf("name:%s, age:%d, score:%.2f\n", s.name, s.age, s.score);
    return 0;
}

输出结果:

name:Tom, age:18, score:90.50
联合体

联合体是一种特殊的结构体,所有成员共用同一块内存空间。联合体的大小是所有成员中最大的那个成员的大小。因此,在联合体中只能对其中一个成员进行操作,对于其他成员的修改将会影响到这个成员。

定义联合体的语法如下:

union union_name
{
    data_type member1;
    data_type member2;
    ...
    data_type member_n;
};

其中,union_name是联合体名称,member是联合体成员名,data_type是成员的数据类型。

下面是一个示例:

#include <stdio.h>

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

int main()
{
    union data d;
    d.num = 10;
    printf("num = %d\n", d.num);
    d.f = 3.14;
    printf("f = %.2f\n", d.f);
    strcpy(d.str, "hello");
    printf("str = %s\n", d.str);
    return 0;
}

输出结果:

num = 10
f = 3.14
str = hello

在这个示例中,可以看到对联合体中各个成员的修改会影响到其他成员。在给d.str赋值时,会覆盖d.num和d.f的值。

总结

结构体和联合体都是C语言中常用的复合数据类型,都可以通过定义多个不同类型的成员来组成一个复杂的变量类型。不同的是,结构体中所有成员都有自己的内存空间,而联合体中所有成员共用同一块内存空间。因此,在使用结构体和联合体时需要根据实际情况来选择使用哪种复合数据类型。