文档介绍:第11章结构体、共同体和枚举类型
学习目标:
掌握结构体的用法
学会使用共同体
学会定义枚举类型
结构体
前面的章节已介绍了一种构造类型数据——数组。数组是具有相同数据类型的数据所组成的集合体,它的引入为程序设计带来了很大的方便。但是在实际问题中,只有这些数据类型是不够的,很多时候需要将不同类型的数据组合成一个有机的整体,以便于引用。例如,在学生登记表中,姓名应为字符型;学号可为整型或字符型;年龄应为整型;性别应为字符型;成绩可为整型或实型。显然不能用一个数组来存放这一组数据。因为数组中各元素的类型和长度都必须一致,以便于编译系统处理。为了解决这个问题,C语言中给出了另一种构造数据类型——“结构体”。它相当于其它高级语言中的“记录”。
“结构体”是一种构造类型,它通常是由不同数据类型的数据所组成的集合体。构成结构体的数据称之为结构体成员。每一个成员具有不同的名字,可以是一个基本数据类型或者又是一个构造类型。为了处理方便,每一个结构体都有一个名字,而所有的成员都组成在该名字之下。因此结构体的每一个成员都是通过其名字来引用的,而不像数组是通过下标来引用。
结构体的定义
由于结构体是由不同数据类型的数据成组成的集合体,它包含若干个成员。那么在说明和使用结构体之前必须先定义它,也就是构造它。如同在说明和调用函数之前要先定义函数一样。结构体定义实际上是说明结构体是由哪些成员所组成,以及成员的数据类型。
定义一个结构的一般形式为:
struct 结构体名
{
结构体成员表;
};
struct是保留字,“struct 结构体名”称为结构体类型标识符,或称为结构体类型名。大括号中的结构体成员表称为结构体。成员表由若干个成员组成,每个成员都是该结构的一个组成部分。
对每个成员也必须作类型说明,其形式为:
类型说明符成员名;
成员名的命名应符合标识符的书写规定。例如:
struct student
{
int num;
char name[20];
char sex;
float score;
};
在这个结构体定义中,结构体名为student,该结构由4个成员组成。第一个成员为num,整型变量;第二个成员为name,字符数组;第三个成员为sex,字符变量;第四个成员为score,实型变量。应注意在括号后的分号是不可少的。结构体定义之后,即可进行变量说明。凡说明为结构体student的变量都由上述4个成员组成。由此可见, 结构体是一种复杂的数据类型,是数目固定,类型不同的若干有序变量的集合。
有关结构体定义请注意如下:
(1)结构体定义描述了结构体的组织形式,但在编译时并不为它分配存储空间,只是规定了一种特定的数据结构体类型及它所占用的存储空间的存储模型。
(2)结构体的成员可以是简单变量、数组、指针、结构体或联合体等。例如:
struct clist
{
int count;
char *first;
char *last;
};
其中,含有一个整形量和两个字符指针量。
(3)结构体定义可以在函数内部,也可以在函数外部。在内部定义的结构体,只在函数内部可见;在外部定义的结构体,从定义点到源文件尾之间的所有函数都可见。
(4)结构体可以嵌套定义,即一个结构体也可以成为另一个结构体的成员。例如,表示一个项目进发情况需要如下信息:项目名称、项目编号、开始日期、计划完成日期、计划投资数额、实际投资数额。由于日期可用一个结构类型表示,因而表示项目的结构类型project定义如下:
struct project
{
char name[100];
long int num;
struct date
{
int year;
int month;
int day;
}start,plan;
double p_invest,r_invest;
};
然后利用结构类型project可以定义相应的变量。在类型project中含有结构类型为date的量start和plan,从而构成嵌套形式的结构。嵌套的结构类型可以是上面的形式,即子结构类型及其变量的定义都放在外层结构的成员表中,也可以采取另一种形式,把子结构类型的定义放在前面,子结构类型的变量出现在成员表中。这样,project结构可被定义为:
struct date
{
int year,month,day;
};
struct project
{
char name[100];
long int num;
struct date start,plan;
double p_invest,r_invest;
};
但是应注意,结构类型定义不允许递归,即:一个结构类型的成员中不含有类型为本结构的变量。例如下面定义是非法的。
struct wrong
{
ch