【第十一章 结构体和共用体】
结构体是C语言中的一种复杂数据类型,它允许我们将多个不同类型的变量组合在一起,形成一个新的类型。在结构体中,每个变量被称为“成员”,它们按照定义的顺序存储在内存中。结构体类型可以用来表示现实世界中的实体,比如在本例中提到的学生信息,包括姓名、学号、性别和成绩。
11.1 结构体
结构体类型定义的基本语法是:
```c
struct 结构体名 {
类型说明符 成员名;
// ...
};
```
例如,定义一个名为`student`的结构体:
```c
struct student {
int num;
char name[20];
char sex;
float score;
};
```
11.1.1 结构体类型的概念
结构体类型定义后,可以通过以下3种方式定义结构体变量:
1. 先定义结构体类型,然后定义结构体变量:
```c
struct student {
// ...
};
struct student stu1, stu2;
```
2. 结构体类型和变量定义一起完成:
```c
struct student {
// ...
} stu1, stu2;
```
3. 直接定义结构体变量,省略类型名:
```c
struct {
// ...
} stu1, stu2;
```
11.1.2 结构体变量的定义
结构体变量在内存中占有一定的空间,其大小等于所有成员的大小之和,并且可能会进行内存对齐优化。例如,`struct student`类型的变量`stu1`和`stu2`在内存中可能占用41个字节(成员大小总和,考虑内存对齐)。
11.1.3 结构体变量的引用
引用结构体变量的成员使用点运算符(`.`),例如:
```c
stu1.num = 10134;
strcpy(stu1.name, "Liming");
stu2.num = 11345;
strcpy(stu2.name, "Wangrui");
```
成员运算符`.`具有最高的优先级,所以`stu1.num++`会递增`stu1`的`num`成员。
11.2 结构体数组
结构体也可以被用作数组元素,创建结构体数组可以存储多个具有相同结构的数据。例如:
```c
struct student arr[10];
```
11.3 结构体指针
结构体指针用于指向结构体变量的地址,可以用来间接访问结构体成员。定义结构体指针和通过指针访问成员如下:
```c
struct student *ptr;
ptr = &stu1;
ptr->num = 10136; // 使用箭头运算符->访问成员
```
11.4 结构体的嵌套
结构体中还可以包含其他结构体作为成员,形成嵌套结构。例如:
```c
struct address {
char street[50];
char city[30];
};
struct student {
int num;
char name[20];
struct address addr;
float score;
};
```
11.5 链表
链表是一种动态数据结构,节点由结构体组成,每个节点包含数据和指向下一个节点的指针。链表的操作包括插入、删除、遍历等。
11.6 链表相关操作
链表操作通常涉及创建新节点、连接节点、查找节点、删除节点等。
11.7 共用体
共用体(union)允许在一个内存位置存储不同类型的数据,但同一时间只能访问其中一种。例如:
```c
union data {
int i;
float f;
};
```
11.8 枚举类型
枚举(enum)定义一组命名的整数常量,便于编程和阅读代码。例如:
```c
enum Color {Red, Green, Blue};
```
11.9 实战练习
这部分通常会提供一些编程问题,让学生运用学到的结构体和共用体知识来解决。
通过以上内容的学习,读者应能掌握结构体、共用体及其相关操作,为编写更复杂的C程序打下基础。