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

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

C语言中的结构体与联合

在C语言中,我们可以通过结构体和联合来定义新的数据类型。它们可以包含多个不同类型的变量,有利于组织和管理复杂的数据结构。

结构体 struct

结构体是一种用户自定义的数据类型,用于组合不同类型的变量,可以将其视为一个集合。结构体的定义方式如下:

struct 结构体名{
    类型1 成员1;
    类型2 成员2;
    ...
    类型n 成员n;
};

其中,结构体名可以自定义,成员可以是任何C基本数据类型,例如int、char、float等,也可以是其他结构体。定义一个struct类型后,就可以使用它来声明变量了。例如:

#include <stdio.h>

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

int main()
{
    struct Student s;

    printf("请输入学生的姓名:");
    scanf("%s", &s.name);

    printf("请输入学生的年龄:");
    scanf("%d", &s.age);

    printf("请输入学生的成绩:");
    scanf("%f", &s.score);

    printf("姓名:%s\n", s.name);
    printf("年龄:%d\n", s.age);
    printf("成绩:%f\n", s.score);

    return 0;
}

上面的示例定义了一个名为Stduent的结构体,包含了三个成员:姓名(name)、年龄(age)、成绩(score)。在main函数中,定义了一个以该结构体定义的变量s,通过三个scanf函数输入学生信息,并在最后输出学生信息。

联合 union

联合也是一种用户自定义的数据类型,与结构体不同的是,联合中的所有成员共享同一个内存空间,只能访问其中的一种成员。定义方式如下:

union 联合名{
    类型1 成员1;
    类型2 成员2;
    ...
    类型n 成员n;
};

联合名可以自定义,成员可以是任何C基本数据类型。定义一个union类型后,也可以使用它来声明变量。例如:

#include <stdio.h>

union Data {
    int i;
    float f;
};

int main()
{
    union Data data;

    printf("内存中的大小:%lu\n", sizeof(data));

    data.i = 10;
    printf("data.i: %d\n", data.i);
    printf("data.f: %f\n", data.f);

    data.f = 3.14;
    printf("data.i: %d\n", data.i);
    printf("data.f: %f\n", data.f);

    return 0;
}

上面的示例定义了一个名为Data的联合,包含了两个成员:一个int类型的成员i和一个float类型的成员f。在main函数中,定义了一个以该联合定义的变量data,通过sizeof函数查看该联合在内存中的大小,然后分别给i和f成员赋值,输出它们的值。由于联合的所有成员共享同一个内存空间,所以改变一个成员的值,会影响到其他成员的值。

在使用结构体和联合时,需要注意内存对齐的问题。结构体和联合的成员变量在内存中占用的空间通常要按照操作系统的规定进行对齐。可以使用#pragma pack指令来改变对齐方式。下面是一个示例:

#include <stdio.h>

#pragma pack(1) // 改为1字节对齐

struct Demo {
    char a;
    int b;
};

int main()
{
    printf("size = %lu\n", size(Demo)); // 结果:5

    return 0;
}

最后,需要注意的是,结构体与联合的成员可以是指针类型,这将给程序的编写和调试带来一定的困难,需要谨慎使用。