C语言中结构(struct)与结合(union)是两个常用的数据类型。它们不仅有相似之处,也有很多的区别。
结构体(struct)
结构(struct)是一种自定义的复合数据类型。它可以将不同数据类型的成员组合成一个整体,在程序中方便地传递、使用和存储。
定义结构体
结构体的定义包含两个部分:结构体声明和结构体定义。
结构体声明用于声明结构体类型,格式如下:
struct 结构体名称;
结构体定义用于定义结构体成员,格式如下:
struct 结构体名称 {
数据类型 成员1;
数据类型 成员2;
...
};
示例代码:
struct Student {
char name[20];
int age;
char sex;
float score;
};
初始化结构体
结构体可以通过以下两种方式进行初始化:
- 逐个成员初始化法
- 整体初始化法
逐个成员初始化法:
struct Student stu1;
strcpy(stu1.name, "张三");
stu1.age = 18;
stu1.sex = 'M';
stu1.score = 98.5;
整体初始化法:
struct Student stu2 = {"李四", 20, 'F', 89.5};
访问结构体成员
可以使用点(.)运算符或箭头(->)运算符访问结构体成员。
点运算符用于访问结构体变量的成员。例如:
printf("姓名:%s\n", stu1.name);
printf("年龄:%d\n", stu1.age);
printf("性别:%c\n", stu1.sex);
printf("分数:%f\n", stu1.score);
箭头运算符用于访问结构体指针变量所指向的成员。例如:
struct Student *pstu = &stu2;
printf("姓名:%s\n", pstu->name);
printf("年龄:%d\n", pstu->age);
printf("性别:%c\n", pstu->sex);
printf("分数:%f\n", pstu->score);
联合体(union)
联合体(union)也是一种自定义的复合数据类型。它与结构体类似,也可以将不同数据类型的成员组合在一起,但是它的成员只能够同时被使用。
定义联合体
联合体的定义格式如下:
union 联合体名称 {
数据类型 成员1;
数据类型 成员2;
...
};
示例代码:
union DataType {
int i;
char ch;
float f;
};
联合体的使用
在联合体中,不同的成员共享同一块内存空间,这意味着在使用某一个成员时,其他成员的值会被覆盖。
例如:
union DataType data;
data.i = 100;
printf("整数型成员变量值为:%d\n", data.i);
data.f = 3.14;
printf("浮点型成员变量值为:%f\n", data.f);
上述程序输出结果为:
整数型成员变量值为:100
浮点型成员变量值为:3.140000
在这个例子中,我们赋值给整数型成员变量后,又赋值了浮点型成员变量,则整数型成员变量的值被覆盖。
总结
结构与联合都可以将不同数据类型的成员集合成为一组数据,在程序中方便使用。
不同之处在于:
- 结构体的成员占用独立的内存空间,可以同时访问。
- 联合体的成员共享同一块内存空间,不能同时访问。
因此,结构体适用于描述多个属性的实体,而联合体则适用于需要交替使用不同数据类型的场合。