2 C语言高级特性之结构体与联合体

在 C 语言中,结构体和联合体是重要的复杂数据类型,能够帮助我们以更加有组织的方式管理数据。本篇将深入探讨它们的定义、用途及区别,并结合实际案例,使读者能够更好地理解这些概念。

1. 结构体

1.1 结构体的定义与使用

结构体 是一种聚合数据类型,它可以将不同类型的数据组合成一个单一的实体。定义结构体的基本语法如下:

1
2
3
4
5
struct 结构体名 {
数据类型 成员名1;
数据类型 成员名2;
...
};

1.1.1 示例

定义一个 学生 结构体来存储学生的基本信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
#include <string.h>

struct Student {
char name[50];
int age;
float gpa;
};

int main() {
struct Student student1;

// 填充学生信息
strcpy(student1.name, "Alice");
student1.age = 20;
student1.gpa = 3.75;

// 输出学生信息
printf("Name: %s\n", student1.name);
printf("Age: %d\n", student1.age);
printf("GPA: %.2f\n", student1.gpa);

return 0;
}

在上面的例子中,我们定义了一个 Student 结构体,它包含 nameagegpa 三个成员。通过 student1 实例,我们可以轻松访问和修改这些信息。

1.2 结构体数组

结构体数组允许我们处理相同类型的多个结构体实例。例如,可以创建一个学生数组以存储多个学生的信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <stdio.h>
#include <string.h>

struct Student {
char name[50];
int age;
float gpa;
};

int main() {
struct Student students[3];

// 填充学生信息
strcpy(students[0].name, "Alice");
students[0].age = 20;
students[0].gpa = 3.75;

strcpy(students[1].name, "Bob");
students[1].age = 22;
students[1].gpa = 3.85;

strcpy(students[2].name, "Charlie");
students[2].age = 21;
students[2].gpa = 3.90;

// 输出所有学生信息
for (int i = 0; i < 3; i++) {
printf("Name: %s, Age: %d, GPA: %.2f\n", students[i].name, students[i].age, students[i].gpa);
}

return 0;
}

在此示例中,通过 students 数组存储了三名学生的信息。使用循环,我们可以方便地输出所有学生的数据。

2. 联합体

2.1 联合体的定义与使用

联合体 是一种特殊的数据类型,可以在同一个位置存储不同类型的数据。与结构体不同,联合体的所有成员共享同一段内存,因此在同一时刻只能存储一个成员的值。这可以通过节省内存空间的方式提供更多灵活性,其基本语法如下:

1
2
3
4
5
union 联合体名 {
数据类型 成员名1;
数据类型 成员名2;
...
};

2.1.1 示例

定义一个 数据 联合体来存储不同类型的数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>

union Data {
int intVal;
float floatVal;
char str[20];
};

int main() {
union Data data;

// 将整数存入联合体
data.intVal = 10;
printf("data.intVal: %d\n", data.intVal);

// 将浮点数存入联合体
data.floatVal = 220.5;
printf("data.floatVal: %.2f\n", data.floatVal); // 注意:此时 intVal 的值可能不再有效

// 将字符串存入联合体
strcpy(data.str, "Hello");
printf("data.str: %s\n", data.str); // 注意:此时 intVal 和 floatVal 的值可能不再有效

return 0;
}

在此示例中,Data 联合体可以存储一个整数、一个浮点数或一个字符串,但始终只会保留其中一个值。设置新值时,之前存储的值会被覆盖。

2.2 联合体的大小

可以使用 sizeof 运算符来检查联合体的大小。联合体的大小为其最大成员的大小:

1
printf("Size of union Data: %zu\n", sizeof(data));

3. 结构体与联合体的比较

特性 结构体 联合体
内存分配 为所有成员分配内存 共享同一段内存,大小为最大成员尺寸
存储数据的方式 可以同时存储所有成员的值 只能存储一个成员的值
使用场景 合同信息、学生记录等 多种数据类型的临时存储(如网络数据)

结论

通过理解 结构体联合体,可以在 C 语言编程中有效地管理和组织复杂数据。结构体 适合需要同时存储多项数据的场景,而 联合体 则在节省内存和灵活性方面提供了独特的优势。

下一篇我们将讨论 枚举位域 的相关内容,进一步扩展 C 语言的高级特性。

2 C语言高级特性之结构体与联合体

https://zglg.work/cplusplus-one/2/

作者

IT教程网(郭震)

发布于

2024-08-10

更新于

2024-08-10

许可协议

分享转发

交流

更多教程加公众号

更多教程加公众号

加入星球获取PDF

加入星球获取PDF

打卡评论