C语言进阶:结构体与联合体的使用
发布时间: 2024-04-03 10:07:16 阅读量: 9 订阅数: 12
# 1. 理解结构体
结构体在C语言中是一种用户自定义的数据类型,用来存储不同数据类型的集合,这些数据可以是基本数据类型、数组、指针等。结构体提供了一种将相关数据组织在一起的方式,方便管理和操作。
### 1.1 什么是结构体?
结构体是一种复合数据类型,其内部可以包含多个不同类型的成员,在内存中按照定义时的顺序依次分配空间。通过结构体,可以将多个相关的数据组织在一起,形成一个整体,提高代码的可读性和维护性。
### 1.2 结构体的定义与声明
在C语言中,定义结构体使用关键字`struct`,然后在大括号内声明结构体的成员,最后通过结构体名称定义一个结构体变量。
```C
#include <stdio.h>
// 定义结构体
struct Student {
int id;
char name[20];
float score;
};
int main() {
// 声明结构体变量并初始化
struct Student s = {2021001, "Alice", 90.5};
// 输出结构体成员
printf("Student ID: %d\n", s.id);
printf("Student Name: %s\n", s.name);
printf("Student Score: %.1f\n", s.score);
return 0;
}
```
**代码总结:** 在上述代码中,我们定义了一个名为`Student`的结构体,包含了学生的学号、姓名和成绩三个成员变量。然后在`main`函数中声明一个结构体变量`s`并初始化,最后输出结构体成员的值。
**结果说明:** 运行程序后会输出结构体变量`s`中存储的学生信息,包括学号、姓名和成绩。
# 2. 结构体的高级应用
结构体在C语言中是非常重要的数据类型,不仅可以用来存储不同类型的数据,还可以进行嵌套、传递给函数等高级操作。
### 2.1 结构体嵌套与嵌套结构体访问
结构体可以嵌套定义,形成更复杂的数据结构。通过访问嵌套结构体的成员,可以实现对多层数据的操作。
```c
#include <stdio.h>
// 定义学生结构体
struct student {
char name[20];
int age;
};
// 定义班级结构体
struct classroom {
int class_num;
struct student monitor; // 嵌套学生结构体
};
int main() {
struct classroom my_class = {1, {"Alice", 18}};
printf("Class Number: %d\n", my_class.class_num);
printf("Monitor Name: %s\n", my_class.monitor.name);
printf("Monitor Age: %d\n", my_class.monitor.age);
return 0;
}
```
**代码总结:** 上述代码演示了结构体嵌套的用法,通过访问嵌套结构体的成员,可以获取到更深层次的数据信息。
**结果说明:** 运行程序后会输出班级号、班长姓名和年龄。
### 2.2 结构体与函数的结合运用
结构体可以作为函数参数传递,便于操作复杂的数据结构。下面是一个结构体作为函数参数的示例:
```c
#include <stdio.h>
// 定义学生结构体
struct student {
char name[20];
int age;
};
// 函数通过结构体参数修改学生信息
void change_student_info(struct student *s, char new_name[20], int new_age) {
strcpy(s->name, new_name);
s->age = new_age;
}
int main() {
struct student my_student = {"Bob", 20};
printf("Before Change - Name: %s, Age: %d\n", my_student.name, my_student.age);
change_student_info(&my_student, "David", 22);
printf("After Change - Name: %s, Age: %d\n", my_student.name, my_student.age);
return 0;
}
```
**代码总结:** 上述代码展示了如何在函数中通过结构体指针修改结构体的成员数据。
**结果说明:** 运行程序后会输出修改前后的学生信息。
### 2.3 结构体的对齐与填充
结构体在内存中的存储是按照对齐规则对齐的,存在填充以满足对齐要求。可以使用`#pragma pack`指令取消对齐,减少内存浪费。
```c
#include <stdio.h>
// 默认情况下的结构体大小
struct default_struct {
char c;
int i;
char d;
};
// 使用#pragma pack取消对齐
#pragma pack(1)
struct packed_struct {
char c;
int i;
char d;
};
#pragma pack()
int main() {
printf("Size of Default Struct: %ld\n", sizeof(struct default_struct));
printf(
```
0
0