C语言 结构体和联合体的区别
什么是结构体
在 C 语言中,结构体是一种自定义数据类型,它允许程序员将不同类型的变量组合在一起,形成一个数据集合。结构体是由一组多个变量组成的新的数据类型,在定义结构体时,需要定义这个结构体包含的成员变量的类型和名称。
通常定义结构体的方式为:
struct 结构体名称{
成员变量1;
成员变量2;
...........
成员变量n;
};
其中,结构体名称是自定义的,可以是任意合法的标识符,成员变量是由数据类型和标识符组成的。
例如,定义一个存储学生信息的结构体:
struct Students{
char name[20];
int age;
char gender;
char address[50];
};
在这个结构体中,我们定义了四个成员变量,分别是学生姓名、学生年龄、学生性别、学生地址。
定义了结构体之后,我们可以通过结构体的名称来声明变量,也可以通过"."运算符来访问结构体的成员变量,例如:
struct Students stu; // 声明了一个名为stu的学生信息结构体变量
strcpy(stu.name, "Tom"); // 向变量stu中的name成员变量中赋值为"Tom"
stu.age = 18; // 向变量stu中的age成员变量中赋值为18
stu.gender = 'M'; // 向变量stu中的gender成员变量中赋值为'M'
strcpy(stu.address, "No.123, Xinyuan Street, Haidian District, Beijing"); // 向变量stu中的address成员变量中赋值为"No.123, Xinyuan Street, Haidian District, Beijing"
什么是联合体
在 C 语言中,联合体是一种特殊的结构体。不同的是,联合体中的成员变量共享同一内存区域,即联合体中的所有成员变量占用的是同一块内存空间。因此,联合体的各个成员只能是同一种数据类型,这些成员只有一个可以被激活。
通常定义联合体的方式为:
union 联合体名称{
成员变量1;
成员变量2;
...........
成员变量n;
};
和结构体一样,联合体中的成员变量是由数据类型和标识符组成的。定义联合体之后,我们可以通过联合体的名称来声明变量,也可以通过"."运算符来访问联合体的成员变量。
例如,定义一个联合体:
union Data {
int i;
float f;
char str[20];
};
在这个联合体中,我们定义了三个成员变量,分别是一个整型变量、一个浮点型变量和一个字符串变量。
我们可以通过联合体来存储一个整型、浮点型或字符串类型的数据,但是在同一时间内,联合体中只能有一个成员变量被激活,即只能存储其中的一种数据类型。例如:
union Data data;
data.i = 10;
printf( "data.i : %d\n", data.i);
data.f = 220.5;
printf( "data.f : %f\n", data.f);
strcpy( data.str, "C Programming");
printf( "data.str : %s\n", data.str);
在这个示例中,我们定义了一个联合体data,并依次往其中赋值一个整型、一个浮点型和一个字符串变量。但需要注意的是,每次变量被赋值之后,其他的成员变量会被自动更新为新值,因为每个成员变量都共享同一块内存空间。
区别
结构体和联合体之间的主要区别在于:
- 结构体的不同成员变量占用不同的内存空间,而联合体的不同成员变量共享同一块内存空间;
- 结构体中的多个成员变量可以同时被使用,而联合体中只能有一个成员变量被激活。
对于不同的应用场景,我们需要选择适合的数据类型来存储数据。如果需要存储多种不同类型的数据,可以使用结构体。如果需要只存储其中一种数据类型,并且在不同的时间段中需要存储不同类型的数据,可以使用联合体。
例子
示例1:一个学生信息的结构体程序
#include <stdio.h>
#include <string.h>
struct student{
char name[20];
int age;
char gender;
char address[50];
};
int main()
{
struct student stu; // 定义结构体变量stu,用于存储学生信息
printf("请输入学生姓名:");
scanf("%s", stu.name);
printf("请输入学生年龄:");
scanf("%d", &stu.age);
printf("请输入学生性别:");
scanf(" %c", &stu.gender);
printf("请输入学生地址:");
scanf("%s", stu.address);
printf("\n学生信息如下:\n");
printf("姓名:%s\n", stu.name);
printf("年龄:%d\n", stu.age);
printf("性别:%c\n", stu.gender);
printf("地址:%s\n", stu.address);
return 0;
}
这个程序通过一个学生信息的结构体来存储学生的姓名、年龄、性别和地址信息,用户可以输入这些信息,程序将其存储起来并输出。
示例2:一个简单的计算器程序
#include <stdio.h>
union calc{
int num;
char op;
};
int main()
{
char operator;
int num1, num2, result;
union calc value;
printf("请输入运算符(+, -, *, / ):");
scanf("%c", &operator);
printf("请输入两个数字:");
scanf("%d", &num1);
scanf("%d", &num2);
value.num = num1;
switch(operator){
case '+':
value.num += num2;
break;
case '-':
value.num -= num2;
break;
case '*':
value.num *= num2;
break;
case '/':
value.num /= num2;
break;
default:
printf("错误的运算符\n");
return 1;
}
printf("运算结果:%d\n", value.num);
return 0;
}
这个程序通过一个简单的联合体来实现加、减、乘、除四种运算。用户输入指定的运算符和两个数字,程序通过算法计算出结果,并输出。在这个程序中,我们使用了联合体来存储两个数字和一个运算符,根据不同的运算符,选择联合体中的不同成员变量来完成运算。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言 结构体和联合体的区别 - Python技术站