9.1 定义和使用结构体变量
-
1、自己建立结构体类型
- (1)概述
C语言允许用户自己建立由不同类型数据组成的组合型额数据结构,它称为结构体(structre)。 - (2)结构体类型的声明
struct 结构体名 { 成员列表 };
其主要组成为:
①关键字struct,不能省略;
②结构体名,由用户指定,又叫结构体标记;
③成员列表,可以是另外一个结构体类型。 - (1)概述
-
2、定义结构体类型变量
- (1)先声明结构体类型,再定义该类型的变量
struct 结构体名 结构体变量名1,结构体变量名2,…,结构体变量名n; - (2)在声明类型的同时定义变量
struct 结构体名 { 成员列表 }变量名列表;
- (3)不指定类型名而直接定义结构体类型变量
struct { 成员列表 }变量名列表;
无名的结构体类型,显然不能再以此结构体类型去定义其他变量,这种方式用得不多。
- (1)先声明结构体类型,再定义该类型的变量
-
3、结构体变量的初始化和引用
- (1)结构体变量初始化
①在定义结构体变量时对所有元素进行初始化,一般形式如下:
②在定义结构体变量时对部分元素进行初始化,一般形式如下:
- (2)结构体变量的引用
①结构体变量的一般形式如下:
结构体变量名.成员名
②结构体变量中的成员又是一个结构体变量,则为多级引用,例如:
- (3)结构体变量的其他用法
①结构体变量的成员可以像普通变量一样进行各种运算;
②同类的结构体变量可以互相赋值;
③可以引用结构体变量成员的地址,也可以引用结构体变量的地址。
- (1)结构体变量初始化
9.2 使用结构体数组
-
1、定义结构体数组的两种形式
- (1)声明类型的同时定义结构体数组
struct 结构体名{ 成员列表 }数组名[数组长度];
- (2)先声明一个结构体类型,然后再用此类型定义结构体数组:
结构体类型 数组名[数组长度];
-
2、对结构体数组的初始化
在定义数组的后面加上“={初值表列};”即可。
9.3 结构体指针
结构体指针是指指向结构体变量的指针,一个结构体变量的起始地址是指这个结构体变量的指针。
- 1、指向结构体变量的指针
指向结构体对象的指针变量既可指向结构体变量,也可指向结构体数组中的元素。指针变量的基类型必须与结构体变量的类型相同。
设结构体指针p指向结构体变量stu,num是其成员,则以下三种用法等价:
①stu.成员名(如stu.num);
②(*p).成员名(如(*p).num);
③p->成员名(如p->num)。 - 2、指向结构体数组的指针
可以用指针变量指向结构体数组的元素。设有指向结构体数组的指针p,则:
①假设p的初值为stu,即指向stu的第一个元素,p+1后,p就指向下一个元素;
②p应该指向指定的结构体类型的对象,而不是指向结构体数组元素中的某一成员。 - 3、用结构体变量指针作函数参数
结构体作函数参数分类有三种:
①用结构体变量的成员作参数
②用结构体变量作实参
③用指向结构体变量(或数组元素)的指针作实参
9.4 用指针处理链表
- 1、定义
链表是一种常见的重要的数据结构。不同于数组的固定长度,链表是根据需要开辟内存单元,它是动态地进行存储分配的一种结构。 - 2、结构
简单的单向链表结构如下图所示,链表中每一个元素称为结点,每个结点都应包括两个部分:
①用户需要用的实际数据;
②下一个结点的地址。
- 3、建立链表
结构体变量是建立链表最适合的方法,用部分成员来存放用户实际数据、用指针类型成员来存放下一个结点的位置,设有以下结构体类型:
struct Student
{
int num;
float score;
struct Student *next; //next是指针变量,指向结构体变量
}
则建立的链表如下图所示:
- 4、输出链表
链表的输出N-S流程图如图9-3所示。
9.5 共用体类型
-
1、什么是共用体类型
- (1)基本概念
有时想用同一段内存单元存放不同类型的变量。在存放变量时会使用覆盖技术,即新存入的变量会覆盖前一个数据,前面一个数据就不会起作用,这种使几个不同的变量共享同一段内存的结构,称为“共用体”类型的结构。 - (2)定义公用体
定义公用体类型变量的一般形式为
union 共用体名 { 成员列表 }变量列表;
- (3)与结构体的区别
结构体变量所占内存长度是各成员占的内存长度之和,每个成员分别占有其自己的内存单元;而共用体变量所占的内存长度等于最长的成员的长度。
- (1)基本概念
-
2、引用公用体变量的方式
只有先定义了公用体变量才能引用它,引用方式与结构体变量相同,但是不能引用共用体变量,而只能引用共用体变量中的成员。 -
3、共用体类型数据的特点
- (1)同一个内存段可以用来存放几种不同类型的成员,但在每一瞬时只能存放其中一个成员,而不是同时存放几个。
- (2)可以对共用体变量初始化,但初始化表中只能有一个常量。
- (3)共用体变量中起作用的成员是最后一次被赋值的成员,在对共用体变量中的一个成员赋值后,原有变量存储单元中的值就被取代。
- (4)共用体变量的地址和它的各成员的地址都是同一地址。
- (5)不能对共用体变量名赋值,也不能企图引用变量名来得到一个值。
- (6)C99允许用共用体变量作为函数参数。
9.6 使用枚举类型
如果一个变量只有几种可能的值,则可以定义为枚举(enumeration)类型,“枚举”是指把可能的值一一列举出来,变量的值只限于列举出来的值地范围内。
- 1、声明枚举类型
声明枚举类型的一般形式为:
enum 枚举名{枚举元素列表};
说明:
C语言将枚举类型元素按常量处理,按顺序默认它们的值为0、1、2、3…,因此枚举元素可以进行判断比较。 - 2、定义枚举变量
- (1)若已声明了枚举变量,则定义枚举变量的一般形式为:
enum 枚举名 枚举变量1,枚举变量2,… - (2)若没有声明枚举变量,则定义枚举变量的一般形式为:
enum{枚举变量1,枚举变量2,…}枚举常量1,枚举常量2…
- (1)若已声明了枚举变量,则定义枚举变量的一般形式为:
9.7 用typedef声明新类型名
-
1、简单地用一个新的类型名代替原有的类型名
简单地使用一个新类型名代替原有类型名后,两个类型名的作用是等价的,一般形式为:
typedef旧类型名 新类型名; -
2、命名一个简单地类型名代替复杂的类型表示方法
- (1)命名一个新的类型名代表结构体类型
typedef struct { int month; int day; int year; }Date Date birthday; //定义结构体类型变量birthday,前面不需要加关键字struct
- (2)命名一个新的类型名代表数组类型
typedef int Num[100]; //声明Num为整型数组类型名
Num a; //定义a为整型数组名,它有100个元素 - (3)命名一个新的类型名代表指针类型
typedef char *String; //声明String为字符指针类型
String p,s[10]; //定义p为字符指针变量,s为字符指针组 - (4)命名一个新的类型名代表指向函数的指针类型
typedef int(* Pointer)(); //声明为Pointer为指向函数的指针类型,该函数返回整型值
Pointer p1,p2; //p1,p2为Pointer类型的指针变量