C语言中的结构体与联合体
发布时间: 2024-01-16 03:23:23 阅读量: 47 订阅数: 49
C语言程序设计:第11章 结构体与联合体A.pdf
# 1. C语言中的数据类型简介
在C语言中,数据类型是用来指定变量所占用存储空间的格式和范围,以及变量能够进行的操作。C语言提供了丰富的数据类型,包括基本数据类型和复合数据类型。在复合数据类型中,结构体和联合体是两种常见的类型。
### 1.1 基本数据类型
C语言的基本数据类型包括整型、浮点型、字符型和布尔型。整型可以表示整数值,浮点型可以表示小数值,字符型可以表示单个字符,而布尔型则表示真或假的值。
```c
#include <stdio.h>
int main() {
int num = 10;
float pi = 3.14;
char ch = 'A';
_Bool isTrue = 1;
printf("num: %d\n", num);
printf("pi: %f\n", pi);
printf("ch: %c\n", ch);
printf("isTrue: %d\n", isTrue);
return 0;
}
```
**输出结果:**
```
num: 10
pi: 3.140000
ch: A
isTrue: 1
```
### 1.2 复合数据类型
复合数据类型是由基本数据类型组成的更复杂的数据类型。结构体和联合体是两种常见的复合数据类型。
### 1.3 结构体与联合体的引入
C语言中的结构体和联合体允许将多个不同类型的变量组合在一起,形成一个新的复合数据类型。结构体允许每个成员变量有自己的存储空间,而联合体则使用同一块内存空间存储不同类型的变量。这两种复合数据类型在C语言中的引入为我们提供了更灵活的数据组织和存储方式。
# 2. 结构体的定义与基本用法
C语言中的结构体是一种自定义的复合数据类型,它允许我们将不同类型的变量组合在一起,形成一个具有多个成员的数据结构。通过定义结构体,我们可以更方便地管理一组相关的信息。
### 2.1 结构体的定义
在C语言中,通过使用关键字`struct`来定义一个结构体。结构体的基本语法如下所示:
```c
struct 结构体名 {
数据类型 成员名1;
数据类型 成员名2;
// ...
};
```
其中,`结构体名`是自定义的结构体名称,可以根据需要命名。成员名是结构体中具体的变量名,用于访问结构体中的成员。
例如,我们可以定义一个表示学生信息的结构体,包含姓名、年龄和成绩三个成员:
```c
struct Student {
char name[20];
int age;
float score;
};
```
### 2.2 结构体的初始化
结构体在定义之后,可以通过初始化的方式给结构体中的成员赋初值。结构体的初始化可以通过两种方式进行:
- 使用点(.)操作符对结构体成员进行逐个赋值;
- 在定义结构体的同时进行初始化。
对于第一种方式,我们可以按照成员的顺序逐个赋值,代码如下:
```c
struct Student stu;
stu.age = 20;
stu.score = 90.5;
strcpy(stu.name, "Tom");
```
对于第二种方式,我们可以在定义结构体的同时进行初始化,代码如下:
```c
struct Student stu = {
"Tom",
20,
90.5
};
```
### 2.3 结构体成员的访问与操作
通过结构体变量名和成员名,我们可以访问和操作结构体中的成员。使用点(.)操作符可以访问结构体中的成员。
```c
printf("姓名:%s\n", stu.name);
printf("年龄:%d\n", stu.age);
printf("成绩:%f\n", stu.score);
```
除了使用点(.)操作符之外,还可以使用箭头(->)操作符访问指向结构体的指针中的成员。这在结构体与指针的情况下非常常见。
```c
struct Student *ptr_stu = &stu;
printf("姓名:%s\n", ptr_stu->name);
printf("年龄:%d\n", ptr_stu->age);
printf("成绩:%f\n", ptr_stu->score);
```
通过结构体的成员访问和操作,我们可以对结构体中的数据进行读取和修改,灵活应用结构体来管理和操作复杂的数据结构。
以上是关于结构体的基本定义和用法的介绍。结构体的灵活性和可自定义性使其在C语言中具有重要的作用。结构体的高级应用将在下一章节中继续介绍。
# 3. 结构体的高级应用
在前两章我们已经学习了结构体的基本定义和用法,本章我们将深入探讨结构体的高级应用。
### 3.1 结构体嵌套与指针
结构体可以嵌套另一个结构体,从而构成复杂的数据结构。嵌套结构体可以通过点号操作符来访问内部成员。
我们以一个学生信息为例,创建一个嵌套结构体的数据结构:
```c
#include <stdio.h>
// 定义学生信息结构体
struct student {
char name[20];
int age;
};
// 定义课程信息结构体
struct course {
char subject[20];
float score;
};
// 定义学生信息与课程信息嵌套结构体
struct record {
struct student stu_info;
struct course cou_info;
};
int main() {
// 创建一个学生信息与课程信息的嵌套结构体变量
struct record rec;
// 学生信息赋值
strcpy(rec.stu_info.name, "Tom");
rec.stu_info.age = 18;
// 课程信息赋值
strcpy(rec.cou_info.subject, "Math");
rec.cou_info.score = 90.5;
// 打印学生信息与课程信息
printf("Name: %s\n", rec.stu_info.name);
printf("Age: %d\n", rec.stu_info.age);
printf("Subject: %s\n", rec.cou_info.subject);
printf("Score: %.2f\n", rec.cou_info.score);
return 0;
}
```
运行以上代码,输出结果为:
```
Name: Tom
Age: 18
Subject: Math
Score: 90.50
```
在上面的例子中,我们通过嵌套结构体的方式实现了学生信息与课程信息的组合。可以看到,通过点号操作符,我们可以访问嵌套结构体中的成员。
除了嵌套结构体,我们还可以使用指针来操作结构体。指针可以直接指向结构体变量,并通过指针访问结构体成员。
接下来,我们演示使用指针操作结构体的例子:
```c
#include <stdio.h>
// 定义学生信息结构体
struct student {
char name[20];
int age;
};
int main() {
// 定义学生信息结构体变量
struct student stu;
// 定义学生信息结构体指针
struct student *p_stu;
// 将指针指向结构体变量
p_stu = &stu;
// 通过指针访问结构体成员
strcpy(p_stu->name, "Tom");
p_stu->age = 18;
// 打印结构体成员
printf("Name: %s\n", p_stu->name);
printf("Age: %d\n", p_stu->age);
return 0;
}
```
运行以上代码,输出结果为:
```
Name: Tom
Age: 18
```
在上面的例子中,我们定义了一个指向结构体的指针
0
0