C语言 结构体和联合体的区别

  • Post category:C

以下是有关C语言中结构体和联合体的区别的详细讲解:

结构体和联合体的概述

C语言中,结构体和联合体都是用户自定义的类型,它们可以将不同的数据类型组合在一起生成一个新的数据类型。其中,结构体中的各个成员可以存放不同的数据类型,结构体成员之间的地址是连续的,结构体占用的内存可以看做是各个成员所占内存的总和;而联合体中的各个成员共享同一块内存空间,即各个成员在内存中的起始地址都相同,联合体的大小等于最大成员占用内存空间的大小。

结构体和联合体的用法示例

首先,以下是一个结构体的定义及使用示例:

#include <stdio.h>
#include <string.h>

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

int main() {
    struct Student s1;
    strcpy(s1.name, "张三");
    s1.age = 20;
    s1.score = 90.5;

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

在上面的示例中,我们定义了一个名为Student的结构体,其中包含了姓名、年龄和成绩三个成员变量。在main函数中,我们创建了一个Student类型的结构体变量s1,并给它的成员变量赋值。最后,通过printf函数将s1中的成员变量输出到控制台上。此时,输出的结果是:

姓名:张三,年龄:20,成绩:90.500000

接下来,以下是一个联合体的定义及使用示例:

#include <stdio.h>

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

int main() {
    union Data data;
    data.i = 10;
    data.f = 3.14;
    strcpy(data.str, "hello");

    printf("data.i = %d\n", data.i);
    printf("data.f = %f\n", data.f);
    printf("data.str = %s\n", data.str);
    return 0;
}

在上面的示例中,我们定义了一个名为Data的联合体,其中包含了整型变量、浮点型变量和字符数组三个成员变量。在main函数中,我们创建了一个Data类型的联合体变量data,并给它的成员变量赋值。在代码的最后,我们分别输出data中的三个成员变量来检验我们的赋值是否成功。此时,输出的结果是:

data.i = 1090519040
data.f = 3.140000
data.str = hello

可以看到,尽管我们先给data的整型变量赋值为10,但它最终的值却变为了浮点型变量3.14的二进制编码表示,这是因为浮点型变量f的长度(4字节)大于整型变量i的长度(2字节),因此f占用了i的内存空间。而字符数组str中的值则为我们最后赋给它的字符串hello。这也是联合体的特点之一,即联合体中的各个成员变量共享同一块内存,当我们修改其中一个成员变量的值时,其他成员变量的值也会相应地改变。