以下是有关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
。这也是联合体的特点之一,即联合体中的各个成员变量共享同一块内存,当我们修改其中一个成员变量的值时,其他成员变量的值也会相应地改变。