1、第十一章zrr语言第十一章 结构体在实际问题中,一组相关数据往往具有不同的数据类型,显然不能用一个数组来存放这组数据。因为数组中各元素的类型和长度都必须一致,以便于编译系统处理。为了解决这个问题,语言中给出了另一种构造数据类型“结构体”。它相当于其它高级语言中的记录。11.1 概述 “结构体”是一种构造数据类型, 它是由若干“成员”组成的。每一个成员可以是一个基本数据类型或者又是一个构造类型。既然结构体是一种“构造”而成的数据类型,那么在说明和使用之前必须先定义它,也就是构造它。如同在说明和调用函数之前要先定义函数一样。声明一个结构体的一般形式为:struct 结构体名 成员表列 ; 注意:在
2、花括号后的分号是不可少的。成员列表由若干个成员组成, 每个成员都是该结构的一个组成部分。对每个成员也必须作类型说明,其形式为:类型说明符 成员名; 也可以把成员列表称为域表,每一个成员称为结构体的一个域。成员名的命名应符合标识符的命名原则。例如:struct stu int num;char name20;char sex;float score; 结构体定义之后,即可进行变量说明。凡说明为该结构体类型的变量都由该结构体的成员组成。由此可见,结构体是一种复杂的数据类型,是数目固定,类型不同的若干变量的集合。11.2 结构类型变量的定义定义结构体类型的变量有以下三种方法。以上面定义的stu为例来
3、加以说明。 先定义结构,再说明结构变量。格式为: struct 结构体名 变量名列表;例如:struct stu int num;char name20;char sex;float score;struct stu boy1,boy2; 在定义结构类型的同时说明结构变量。格式为: struct 结构体名 成员列表 变量名列表;例如:struct stu int num;char name20;char sex;float score;boy1,boy2; 直接说明结构变量。格式为:struct 成员列表 变量名列表;例如:struct int num;char name20;char sex
4、;float score;boy1,boy2; 说明:类型与变量在概念上的区别。结构体中的成员可以单独使用,类似于普通变量。结构体的成员也可以是结构体类型的变量。struct date int year;int month;int day; ;struct stu int num;char name20;char sex;float score;struct date birthday;struct stu *next;girl1,girl2;girl1.next=&girl2成员名可以与程序中其他的变量名相同。11.3 结构体变量的引用对于结构体变量的引用,要通过成员运算符“.”,逐个访问其
5、成员,其格式为:结构体变量名.成员其中的“.”是成员运算符,优先级最高,具有左结合性。引用规则为:不能把一个结构体变量作为一个整体输入或者输出,只能对它的各个成员分别进行这样的操作。例如:printf(“%d,%s,%c,%fn”,boy1.num,boy1.name,boy1.sex,boy1.score);float temp;scanf(“%f”,&temp);boy1.score=temp;如果成员本身又是一个结构体变量,则必须逐级使用成员运算符,向下找到最低级的成员才能使用它。例如:scanf(“%d,%d,%d”,&girl.birthday.year, &girl.birthda
6、y.month,&girl.birthday.day);根据成员本身的数据类型,可以对它进行各种适合的操作。例 struc1.c可以引用结构体变量或其成员的地址,多用做函数参数,传递结构体的地址。Struct2.c11.4 结构体变量的初始化结构体变量的初始化与一维数组相似,使用初值表来进行。其格式为:结构体变量名=初值表;如果某一个成员本身又是一个结构体类型的变量,那么它的初值就是一个初值表。例如:struct stu girl=100,”LiHua”,F,81,1980,6,23,*temp; temp=&girl; temp-num;11.5 结构体数组数组元素也可以是结构体类型的。 因
7、此可以构成结构体数组。结构体数组的每一个元素都是具有相同结构体类型的下标结构体变量。 在实际应用中,经常用结构体数组来表示具有相同数据结构的一个群体。 结构体数组的定义与定义结构体类型变量一样,也可以有三种方式。 结构体数组的初始化结构体数组的初始化是在定义的数组的后面加上 “=初值表”如果对全部元素都初始化的话,可以省略数组的长度。例如:struct stu int num;char name20;char sex;float score;boy5=101,Li ping,M,45,102,Zhang ping,M,62.5,103,He fang,F,92.5,104,Cheng ling
8、,F,87,105,Wang ming,M,58; 举例例1:计算学生的平均成绩和不及格的人数。Liz1.cliz2.c11.6 指向结构体类型数据的指针一个结构体变量的指针就是该变量所占据的内存空间的起始地址。 指向结构体变量的指针 定义方法struct 结构体名 *指针变量名使用方法 (*结构体指针变量).成员名结构体指针变量成员名其中 是指向运算符,具有左结合性,优先级最高,功能是得到指针变量所指向的结构体变量的成员的值。struct stu boy,*p=&boy;boy.num (*p).num p-num注意:使用前必须先令指针变量指向一个确定的结构体变量。成员运算符的优先级高于指
9、针运算符,所以第二种使用方法中的括号不能省略。 指向结构体数组的指针定义方法与定义指向普通数组的指针变量相似。使用时要注意:如果p指向数组中的某一个元素,则p+1是指向该数组中的下一个元素的,依然是一个结构体类型的变量。(p+)-num 表示先得到当前元素的num成员的值,再使p指向下一个元素。 (+p)-num 表示使p指向下一个元素,并得到它的num成员的值。定义p是指向某一个结构体变量的指针变量,则p可以指向属于该数据类型的任何变量,但不可以令p指向该变量中某一个具体的成员,因为该成员不一定是结构体类型的。见p291 做函数参数将一个结构体变量的值传递给另一个函数,可以有三种方法:用结构
10、体变量的成员做参数,使用方法与普通变量一样。用结构体变量做参数,此时形参与实参必须都是同一结构体类型的变量。用指向结构体变量的指针做参数,形参与实参必须类型一致,实参把地址传递给形参。Liz3.c117 用指针处理链表链表是一种重要的数据结构,它是动态进行存储分配的一种结构,是动态进行存储分配的一种结构。1 链表由一系列的节点构成,每个节点的数据由2部分构成,包括数据部分和指针部分分别用来存放实际数据和下一个节点的地址。2 可能会有一个头节点用来记录第一个节点的地址。1172 简单链表#define NULL 0main() struct student int num; struct stu
11、dent * next; a,b,c,*p;a.num=101;a.next=&b;b.num=102;b.next=&c;c.num=103;c.next=NULL;p=&a;while(p) printf(“%d”,p-num); p=p-next;11.7.3 处理动态链表所需要的函数malloc(unsigned size)在内存中开辟一个长度为size的存储空间,并且返回空间的起始地址,如果失败则返回NULL。calloc (unsigned n,unsigned size)在内存中开辟n个长度为size的存储空间,并且返回空间的起始地址,如果失败则返回NULL。free(*p)释放指针变量p所指向的存储空间。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1