《【精品】c c++语言程序设计(西电版第6章 结构体、共用体与枚举精品ppt课件.ppt》由会员分享,可在线阅读,更多相关《【精品】c c++语言程序设计(西电版第6章 结构体、共用体与枚举精品ppt课件.ppt(74页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、C C+语言程序设计(西电版)第6章 结构体、共用体与枚举2第第6章章 结构体、共用体与枚构体、共用体与枚举6.1 结构体构体类型的声明型的声明 6.2 结构体构体变量的定量的定义、引用和初始化、引用和初始化 6.3 结构体数构体数组6.4 结构体与指构体与指针6.5 结构体与函数构体与函数6.6 共用体共用体6.7 枚枚举类型型6.8 类型定型定义语句句typedef6.9 小小结3 一一一一个个个个学学学学生生生生的的的的信信信信息息息息有有有有学学学学号号号号、姓姓姓姓名名名名、性性性性别别、年年年年龄龄、住住住住址址址址、成成成成绩绩等。等。等。等。一一一一本本本本图图书书的的的的信信
2、信信息息息息有有有有分分分分类类编编号号号号、书书名名名名、作作作作者者者者、出出出出版版版版社社社社、出版日期出版日期出版日期出版日期、价格价格价格价格、库库存量存量存量存量等。等。等。等。如何描述如何描述如何描述如何描述这这些些些些类类型不同的相关数据?型不同的相关数据?型不同的相关数据?型不同的相关数据?6 6.1.1 结构体构体类型的声明型的声明 信息管理信息管理结构体构体一种构造数据一种构造数据类型型结构体构体由若干不同由若干不同类型的数据型的数据项组成,成,构成构成结构体的各个数据构体的各个数据项称称为结构体成构体成员。4 6 6.1.1 结构体构体类型的声明型的声明结构体类型定义
3、的一般形式:结构体类型定义的一般形式:结构体类型定义的一般形式:结构体类型定义的一般形式:lstruct为关关键字字,不不能能省略;省略;l结构构体体名名是是该结构构体体类型型的的名名称称,命命名名应符符合合标识符符的的定定义要要求。求。成成员可可以以是是任任何何类型型的的变量量,包包括括基基本本数数据据类型型和和构构造造数数据据类型型,如如整整型型、浮浮点点型型和和字字符符型型,数数组和和指指针等等,也也可可以以是是另另一一个个结构构体体类型型的的结构构体体变量量或或自身自身结构体的指构体的指针,还可以是共用体可以是共用体变量。量。struct 结构体名构体名 数据数据类型型1 成成员名名1
4、;数据数据类型型2 成成员名名2;数据数据类型型n 成成员名名n;5例例6.1一个学生的基本信息由学号、姓名、性一个学生的基本信息由学号、姓名、性别、成成绩组成,声明相成,声明相应的的结构体构体类型。型。struct student int num;/*学号是整型学号是整型*/char name20;/*姓名是字符数姓名是字符数组类型型*/char sex;/*性性别是字符型是字符型*/float score;/*成成绩是是实型型*/;6 6.1.1 结构体构体类型的声明型的声明numnum4 4个字节个字节个字节个字节namename2 20 0个字节个字节个字节个字节sexsex1 1个字
5、节个字节个字节个字节scorescore4 4个字节个字节个字节个字节6 6.1.1 结构体构体类型的声明型的声明说说明:明:明:明:(1)(1)结结构体声明的位置,可以在函数内部,也可构体声明的位置,可以在函数内部,也可构体声明的位置,可以在函数内部,也可构体声明的位置,可以在函数内部,也可以在函数外部。在函数内部声明的以在函数外部。在函数内部声明的以在函数外部。在函数内部声明的以在函数外部。在函数内部声明的结结构体,只能在函构体,只能在函构体,只能在函构体,只能在函数内部使用;在函数外部声明的数内部使用;在函数外部声明的数内部使用;在函数外部声明的数内部使用;在函数外部声明的结结构体,其有
6、效范构体,其有效范构体,其有效范构体,其有效范围围是从声明是从声明是从声明是从声明处处开始,直到它所在的源程序文件开始,直到它所在的源程序文件开始,直到它所在的源程序文件开始,直到它所在的源程序文件结结束。束。束。束。(2)(2)数据数据数据数据类类型相同的数据型相同的数据型相同的数据型相同的数据项项,既可逐个、逐行分,既可逐个、逐行分,既可逐个、逐行分,既可逐个、逐行分别别声明,也可以合并成一行声明。如例声明,也可以合并成一行声明。如例声明,也可以合并成一行声明。如例声明,也可以合并成一行声明。如例6.26.2中的日期中的日期中的日期中的日期结结构体构体构体构体类类型,也可改型,也可改型,也
7、可改型,也可改为为如下声明形式:如下声明形式:如下声明形式:如下声明形式:struct datestruct date int year,month,day int year,month,day;86 6.1.1 结构体构体类型的声明型的声明(3)同一同一结构体构体类型中的各成型中的各成员不可以互相不可以互相重名,但不同重名,但不同结构体构体类型型间的成的成员可以重名。可以重名。成成员名可以和程序中的名可以和程序中的变量名相同,两者代表量名相同,两者代表不同的不同的对象,互不干象,互不干扰。如下声明是正确的:。如下声明是正确的:int x,y;/*基本数据基本数据类型型变量量*/struct
8、point int x,y;/*结构体构体point中的一个成中的一个成员*/;96 6.1.1 结构体构体类型的声明型的声明(4)(4)结结构体中成构体中成构体中成构体中成员员的的的的类类型不能是被描述的型不能是被描述的型不能是被描述的型不能是被描述的结结构体本身。如下描述构体本身。如下描述构体本身。如下描述构体本身。如下描述是非法的:是非法的:是非法的:是非法的:struct invalidstruct invalid int n;int n;struct invalid iv;struct invalid iv;10若成若成若成若成员类员类型是描述的型是描述的型是描述的型是描述的结结构体
9、本身的指构体本身的指构体本身的指构体本身的指针针是合法是合法是合法是合法的。如:的。如:的。如:的。如:struct invalid int n;struct invalid*iv;116.2 6.2 结构体构体变量的定量的定义、引用和初始化、引用和初始化 例如:例如:例如:例如:struct studentstruct student stu1,stu2,*p,stu10;stu1,stu2,*p,stu10;1.1.先定先定先定先定义结义结构体,再构体,再构体,再构体,再说说明明明明结结构体构体构体构体变变量。量。量。量。6 6.2.1 2.1 结结构体构体构体构体变变量的定量的定量的定量
10、的定义义 struct 结构体名构体名 若干成若干成员说明明;struct 结构体名构体名 结构体构体变量名表量名表;126.2 6.2 结构体构体变量的定量的定义、引用和初始化、引用和初始化 也可以使用宏定也可以使用宏定也可以使用宏定也可以使用宏定义义用一个符号常量来用一个符号常量来用一个符号常量来用一个符号常量来表示一个表示一个表示一个表示一个结结构体构体构体构体类类型。例如:型。例如:型。例如:型。例如:#define#define STUSTU struct student struct studentstruct studentstruct student int num;int n
11、um;char name20;char name20;char sex;char sex;float score;float score;STUSTU stu1,stu2;stu1,stu2;6 6.2.1 2.1 结结构体构体构体构体变变量的定量的定量的定量的定义义 136.2 6.2 结构体构体变量的定量的定义、引用和初始化、引用和初始化2 2、在定、在定、在定、在定义结义结构体构体构体构体类类型的同型的同型的同型的同时时定定定定义变义变量量量量例如:例如:struct student int num;char name20;char sex;float score;stu1,stu2;6
12、 6.2.1 2.1 结结构体构体构体构体变变量的定量的定量的定量的定义义 struct 结构体名构体名 若干成若干成员说明明 结构体构体变量名表量名表;146.2 6.2 结构体构体变量的定量的定义、引用和初始化、引用和初始化3 3、直接、直接、直接、直接说说明明明明结结构体构体构体构体类类型型型型变变量量量量 例如:例如:struct char name20;char sex;int num;float score;stu1,stu2;6 6.2.1 2.1 结结构体构体构体构体变变量的定量的定量的定量的定义义 struct 若干成若干成员说明明 结构体构体变量名表量名表;156.2 6.
13、2 结构体构体变量的定量的定义、引用和初始化、引用和初始化注意:注意:l l结构构体体类型型与与结构构体体变量量是是两两个个不不同同的的概概念念,其其区区别如如同同int类型型与与int型型变量量的的区区别一一样。编译系系统不不为结构构体体类型型分分配配空空间,只只对结构构体体变量量分分配配空空间。结构构体体类型型变量量所所占占内内存存空空间是是各各成成员变量量所所占占内内存存单元元的的总和和,各各成成员间占占用用的的存存储单元元是是连续的。的。l l结构构体体变量量中中的的成成员可可以以单独独使使用用,它它的的作用与地位相当于普通作用与地位相当于普通变量。量。6 6.2.1 2.1 结结构体
14、构体构体构体变变量的定量的定量的定量的定义义 166.2 6.2 结构体构体变量的定量的定义、引用和初始化、引用和初始化6.2.2 结构体构体变量引用量引用结结构体构体构体构体变变量成量成量成量成员员引用的一般形式引用的一般形式引用的一般形式引用的一般形式:结结构构体体变变量量a的的各各成成员员可可分分别别表表示示为为a.num、a.name、a.sex、a.birthday、a.score struct date int year,month,day;struct student int num;char name20,sex;struct date birthday;float score
15、;a;“.”是分量运是分量运是分量运是分量运算符,运算级算符,运算级算符,运算级算符,运算级别最高。别最高。别最高。别最高。a.birthday.yeara.birthday.montha.birthday.day 结构体变量的各个成员可结构体变量的各个成员可结构体变量的各个成员可结构体变量的各个成员可进行何种运算,由该成员进行何种运算,由该成员进行何种运算,由该成员进行何种运算,由该成员的数据类型决定的数据类型决定的数据类型决定的数据类型决定 结构体变量名结构体变量名.成员名成员名176.2 6.2 结构体构体变量的定量的定义、引用和初始化、引用和初始化6 6.2.2 2.2 结结构体构体构
16、体构体变变量引用量引用量引用量引用注意:注意:(1)不能将一个不能将一个结构体构体变量作量作为一个整体一个整体进行行输入和入和输出,只能出,只能对其成其成员操作。例如,下操作。例如,下列引用是非法的:列引用是非法的:printf(%d,%s,%c,%f,stu1);(2)所引用的成所引用的成员变量与其所属量与其所属类型的普通型的普通变量使用方法一量使用方法一样,可以,可以进行行该类型所允型所允许的的任何运算。任何运算。186.2 6.2 结构体构体变量的定量的定义、引用和初始化、引用和初始化6 6.2.2 2.2 结结构体构体构体构体变变量引用量引用量引用量引用(3)只有当两个只有当两个结构体
17、构体变量具有完全相同的量具有完全相同的结构体构体类型型时,相互之,相互之间才可以整体才可以整体赋值。(4)在用在用scanf语句句输入入结构体构体变量的成量的成员时,输入表列同入表列同样要用地址。如:要用地址。如:scanf(%c,&stu1.sex);(5)如果成如果成员本身是另一个本身是另一个结构体构体变量,在引量,在引用用时则要用若干个成要用若干个成员运算符,一运算符,一级一一级地地找到最低的成找到最低的成员变量,而且只能量,而且只能对最低的成最低的成员变量量进行行赋值或者运算操作。或者运算操作。196.2 6.2 结构体构体变量的定量的定义、引用和初始化、引用和初始化6 6.2.3 2
18、.3 结结构体构体构体构体变变量的初始化量的初始化量的初始化量的初始化【例例例例6 6.3 3】结结构体构体构体构体变变量的初始化、量的初始化、量的初始化、量的初始化、赋值赋值、输输入和入和入和入和输输出出出出 。#include stdio.h#include stdio.hstruct student /*struct student /*定定定定义结义结构体构体构体构体*/int num;int num;char*name;char*name;char sex;char sex;float score;float score;stu1,stu2,stu3=102,Zhang ping,M
19、,78.5;stu1,stu2,stu3=102,Zhang ping,M,78.5;如果初如果初值个数少于个数少于结构体成构体成员个数,个数,则将无初将无初值对应的成的成员赋以以0 0值。如果初如果初值个数多于个数多于结构体成构体成员个数,个数,则编译出出错。struct struct 结结构体名构体名 结构体变量结构体变量=初始化列表初始化列表;206.2 6.2 结构体构体变量的定量的定义、引用和初始化、引用和初始化6 6.2.3 2.3 结结构体构体构体构体变变量的初始化量的初始化量的初始化量的初始化void main()void main()stu1.num=102;stu1.num
20、=102;stu1.name=Zhang ping;stu1.name=Zhang ping;printf(input sex and scoren);printf(input sex and scoren);scanf(%c%f,&stu1.sex,&stu1.score);scanf(%c%f,&stu1.sex,&stu1.score);printf(stu1:Number=%dnName=%sn,stu1.num,stu1.printf(stu1:Number=%dnName=%sn,stu1.num,stu1.name);name);printf(Sex=%cnScore=%.2fn
21、,stu1.sex,stu1.score);printf(Sex=%cnScore=%.2fn,stu1.sex,stu1.score);stu2=stu3;stu2=stu3;printf(stu2:Number=%dnName=%sn,stu2.num,stu2.printf(stu2:Number=%dnName=%sn,stu2.num,stu2.name);name);printf(Sex=%cnScore=%.2fn,stu2.sex,stu2.score);printf(Sex=%cnScore=%.2fn,stu2.sex,stu2.score);216.3 结构体数构体数组6
22、 6.3.1 3.1 结结构体数构体数构体数构体数组组的定的定的定的定义义 定定定定义结义结构体数构体数构体数构体数组组的方法也有三种方式:的方法也有三种方式:的方法也有三种方式:的方法也有三种方式:l l 先定先定先定先定义结义结构体构体构体构体类类型然后再定型然后再定型然后再定型然后再定义结义结构体数构体数构体数构体数组组;l l 在定在定在定在定义结义结构体构体构体构体类类型的同型的同型的同型的同时时定定定定义结义结构体数构体数构体数构体数组组;l l 在定在定在定在定义义无名无名无名无名结结构体构体构体构体类类型的同型的同型的同型的同时时定定定定义结义结构体数构体数构体数构体数组组。s
23、truct studentstruct student int num;int num;char name20;char name20;char sex;char sex;float score;float score;stu3;stu3;226.3 结构体数构体数组6 6.3.2 3.2 结结构体数构体数构体数构体数组组的引用的引用的引用的引用for(i=0;i3;i+)for(i=0;i3;i+)scanf(%d,&stui.num);scanf(%d,&stui.num);fflush(stdin);fflush(stdin);gets(stui.name);gets(stui.name
24、);scanf(%c%f,&stui.sex,&stui.score);scanf(%c%f,&stui.sex,&stui.score);结构体数构体数组名名下下标.成成员名名236.3 结构体数构体数组6 6.3.3 3.3 结结构体数构体数构体数构体数组组的初始化的初始化的初始化的初始化struct student int num;char*name;char sex;float score;stu3=101,Zhao lei,M,45,102,Sun hui,M,62.5,103,Li fang,F,92.5stu0stu1stu2101Zhao leiM45102Sun huiM62
25、.5103Li fangF92.5246.3 结构体数构体数组6 6.3.3 3.3 结结构体数构体数构体数构体数组组的初始化的初始化的初始化的初始化元素的个数可以省略,根据元素的个数可以省略,根据赋初初值时结构构体常量的个数确定数体常量的个数确定数组元素的个数元素的个数。内内层的大括号只是的大括号只是为了了阅读程序的方便,程序的方便,可以省略。可以省略。结构体数构体数组名是名是结构体数构体数组存存储的首地的首地址,可以通址,可以通过数数组名利用指名利用指针法或下法或下标法法访问数数组元素。元素。256.3 结构体数构体数组6 6.3.3 3.3 结结构体数构体数构体数构体数组组的初始化的初始
26、化的初始化的初始化【例例例例6.4 6.4】应应用用用用结结构体数构体数构体数构体数组组建立学生信息,建立学生信息,建立学生信息,建立学生信息,实现输实现输入入入入编编号,号,号,号,查询查询学生的基本信息和成学生的基本信息和成学生的基本信息和成学生的基本信息和成绩绩的功能。的功能。的功能。的功能。#include stdio.h#include stdio.hstruct studentstruct student int num;int num;char name15;char name15;int score3;int score3;stu=1,David,80,78,92,2,Lily
27、,90,84,89,stu=1,David,80,78,92,2,Lily,90,84,89,3,Alice,79,78,96;3,Alice,79,78,96;266.3 结构体数构体数组6 6.3.3 3.3 结结构体数构体数构体数构体数组组的初始化的初始化的初始化的初始化void main()void main()int i,j,number;int i,j,number;printf(input students number:);printf(input students number:);scanf(%d,&number);/*scanf(%d,&number);/*输输入学生的入
28、学生的入学生的入学生的编编号号号号*/for(i=0;i3;i+)/*for(i=0;i3;i+)/*查询查询学生信息学生信息学生信息学生信息*/if(number=stui.num)break;if(number=stui.num)break;printf(name=%sn,stui.name);printf(name=%sn,stui.name);for(j=0;j3;j+)for(j=0;jyear p-month p-day“-”是指向是指向结构体成构体成员运算符,运算符,优先先级为一一级 p=&d.year(*结构体指针变量结构体指针变量).成员名成员名 或:或:结构体指针变量结构体
29、指针变量-成员名成员名 316.4 结构体与指构体与指针6 6.4 4 指向指向指向指向结结构体构体构体构体变变量的指量的指量的指量的指针针2.2.指针变量的引用指针变量的引用指针变量的引用指针变量的引用 pstu-num:得到:得到pstu指向的指向的结构体构体变量中量中的成的成员变量量num的的值。pstu-num+:得到:得到pstu指向的指向的结构体构体变量量中的成中的成员变量量num的的值,先使用,后使,先使用,后使num加加1。+pstu-num:得到:得到pstu指向的指向的结构体构体变量量中的成中的成员变量量num的的值,使,使num先加先加1,再,再使用。使用。326.4 结
30、构体与指构体与指针6 6.4.1 4.1 指向指向指向指向结结构体构体构体构体变变量的指量的指量的指量的指针针 【例【例【例【例6.56.5】指向指向结构体构体变量的指量的指针使用使用#include stdio.hstruct student int num;char*name;char sex;float score;stu1=102,Zhang ping,M,78.5,*pstu;336.4 结构体与指构体与指针6 6.4.1 4.1 指向指向指向指向结结构体构体构体构体变变量的指量的指量的指量的指针针void main()pstu=&stu1;printf(Number=%dnName
31、=%sn,stu1.num,stu1.name);printf(Sex=%cnScore=%fnn,stu1.sex,stu1.score);printf(Number=%dnName=%sn,(*pstu).num,(*pstu).name);printf(Sex=%cnScore=%fnn,(*pstu).sex,(*pstu).score);printf(Number=%dnName=%sn,pstu-num,pstu-name);printf(Sex=%cnScore=%fnn,pstu-sex,pstu-score);346.4 结构体与指构体与指针6 6.4.2 4.2 指向指向指
32、向指向结结构体构体构体构体类类型数型数型数型数组组的指的指的指的指针针1.1.指向结构体类型数组的指针的定义指向结构体类型数组的指针的定义指向结构体类型数组的指针的定义指向结构体类型数组的指针的定义 l l一一一一个个个个结结构构构构体体体体类类型型型型数数数数组组的的的的数数数数组组名名名名是是是是数数数数组组的的的的首首首首地地地地址址址址,结结构构构构体体体体指指指指针针变变量量量量可可可可以以以以指指指指向向向向一一一一个个个个结结构构构构体体体体数数数数组组,这这时时结结构构构构体体体体指指指指针变针变量的量的量的量的值值是整个是整个是整个是整个结结构体数构体数构体数构体数组组的首地
33、址。的首地址。的首地址。的首地址。l l定定定定义义结结构构构构体体体体数数数数组组的的的的指指指指针针和和和和定定定定义义其其其其他他他他数数数数组组的的的的指指指指针针的的的的方方方方法是一法是一法是一法是一样样的的的的 356.4 结构体与指构体与指针6 6.4.2 4.2 指向指向指向指向结结构体构体构体构体类类型数型数型数型数组组的指的指的指的指针针【例】利用【例】利用【例】利用【例】利用结结构体指构体指构体指构体指针输针输出一出一出一出一组组化学化学化学化学元素名称及其原子量。元素名称及其原子量。元素名称及其原子量。元素名称及其原子量。struct list struct list
34、 int i;int i;char name4;char name4;float w;float w;tab4=1,H,1.008,2,He,4.0026,tab4=1,H,1.008,2,He,4.0026,3,Li,6.941,4,Be,9.01218;3,Li,6.941,4,Be,9.01218;tabtab数组数组数组数组1 1H Htab0tab01.0081.0082 2HeHetab1tab14.00264.00263 3LiLitab2tab26.9416.9414 4BeBetab3tab39.012189.012182.2.数组元素的引用数组元素的引用数组元素的引用数组元
35、素的引用 6.4 结构体与指构体与指针6 6.4.2 4.2 指向指向指向指向结结构体构体构体构体类类型数型数型数型数组组的指的指的指的指针针2.2.数组元素的引用数组元素的引用数组元素的引用数组元素的引用 main()main()struct list *p,tab4;struct list *p,tab4;printf(NotNametAtomic printf(NotNametAtomic Weightn);Weightn);for(p=tab;ptab+4;p+)for(p=tab;p-i,pi,p-name,pname,p-w);w);tabtab数组数组数组数组1 1H Htab0
36、tab01.0081.0082 2HeHetab1tab14.00264.00263 3LiLitab2tab26.9416.9414 4BeBetab3tab39.012189.01218pppppNo Name Atomic WeightNo Name Atomic Weight1 H 1.0082 He 4.00263 Li 6.9414 Be 9.0121836376.4 结构体与指构体与指针6 6.4.2 4.2 指向指向指向指向结结构体构体构体构体类类型数型数型数型数组组的指的指的指的指针针【例【例【例【例6 6.6 6】利用指利用指利用指利用指针变针变量量量量输输出出出出结结构体
37、数构体数构体数构体数组组 。#include stdio.h#include stdio.h struct student struct student int num;int num;char*name;char*name;char sex;char sex;float score;float score;stu3=101,Zhao lei,M,45,102,Sun stu3=101,Zhao lei,M,45,102,Sun hui,M,62.5,103,Li fang,F,92.5;hui,M,62.5,103,Li fang,F,92.5;386.4 结构体与指构体与指针6 6.4.2
38、 4.2 指向指向指向指向结结构体构体构体构体类类型数型数型数型数组组的指的指的指的指针针void main()void main()struct student*ps;struct student*ps;printf(NotNamettSextScore n);printf(NotNamettSextScore n);for(ps=stu;psstu+3;ps+)for(ps=stu;psnum,ps-printf(%dt%stt%ct%fn,ps-num,ps-name,ps-sex,ps-score);name,ps-sex,ps-score);396.4 结构体与指构体与指针6 6.4
39、.2 4.2 指向指向指向指向结结构体构体构体构体类类型数型数型数型数组组的指的指的指的指针针注意:注意:(1 1)因)因)因)因为为“-”运算符运算符运算符运算符优优先先先先级级最高,所以最高,所以最高,所以最高,所以ps-numps-num,ps-num+ps-num+,+ps-num+ps-num三个表达式都是三个表达式都是三个表达式都是三个表达式都是对对成成成成员变员变量的操作。量的操作。量的操作。量的操作。(2 2)(+ps)-num(+ps)-num,先使,先使,先使,先使psps加加加加1 1,指向下一个元素,指向下一个元素,指向下一个元素,指向下一个元素,然后得到下一个元素的然
40、后得到下一个元素的然后得到下一个元素的然后得到下一个元素的numnum成成成成员员的的的的值值。(3 3)ps+-numps+-num,先得到,先得到,先得到,先得到psps所指的所指的所指的所指的numnum的的的的值值,然,然,然,然后使后使后使后使psps加加加加1 1,指向下一个元素。,指向下一个元素。,指向下一个元素。,指向下一个元素。406.4 结构体与指构体与指针6 6.4.2 4.2 指向指向指向指向结结构体构体构体构体类类型数型数型数型数组组的指的指的指的指针针 分析自增自减运算分析自增自减运算分析自增自减运算分析自增自减运算对对对对程序程序程序程序结结结结果的影响。果的影响
41、。果的影响。果的影响。struct code int i;char c;a=100,A,200,B,300,C,400,D;a a a a数组数组数组数组100100a0a0 AA200200a1a1 BB300300a2a2 CC400400a3a3 DD416.4 结构体与指构体与指针6 6.4.2 4.2 指向指向指向指向结结构体构体构体构体类类型数型数型数型数组组的指的指的指的指针针main()main()struct code*p=a;struct code*p=a;printf(%dt,+p-i);printf(%dt,+p-i);printf(%ct,(+p)-c);printf
42、(%ct,(+p)-c);printf(%dt,(p+)-i);printf(%dt,(p+)-i);printf(%ct,+p-c);printf(%ct,+p-c);printf(%dt,p-i+);printf(%dt,p-i+);printf(%dn,p-i);printf(%dn,p-i);a a a a数组数组数组数组100100a0a0 AA200200a1a1 BB300300a2a2 CC400400a3a3 DDp101 DD301101B200D300301426.5 结构体与函数构体与函数6.5.1 6.5.1 指向指向指向指向结结构体构体构体构体变变量的指量的指量的指
43、量的指针针作函数参数作函数参数作函数参数作函数参数l l方法一:在函数之方法一:在函数之方法一:在函数之方法一:在函数之间间间间直接直接直接直接传递结传递结传递结传递结构体数据。构体数据。构体数据。构体数据。函函函函数数数数的的的的形形形形参参参参定定定定义义义义为为为为结结结结构构构构体体体体变变变变量量量量。函函函函数数数数调调调调用用用用时时时时,可可可可将将将将主主主主调调调调函函函函数数数数的的的的结结构构构构体体体体类类型型型型实实实实参参参参传传传传递递递递给给给给被被被被调调调调函函函函数数数数的的的的形参形参形参形参。如如如如果果果果将将将将函函函函数数数数定定定定义义义义为
44、为为为结结结结构构构构体体体体类类类类型型型型函函函函数数数数,可可可可利利利利用用用用returnreturn语语语语句句句句将将将将一一一一个个个个结结结结构构构构体体体体数数数数据据据据结结结结果果果果返返返返回回回回到到到到主主主主调调调调函函函函数数数数中中中中。这这一一一一过过程程程程无无无无论论在在在在空空空空间间上上上上还还是是是是在在在在时时间间上上上上都都都都为为系系系系统统增增增增加加加加了了了了开开开开销销,尤尤尤尤其其其其当当当当结结构构构构体体体体变变量量量量含含含含有有有有很很很很多多多多成成成成员员时时,系系系系统统开开开开销销急急急急剧剧增大,程序效率大幅降低
45、。增大,程序效率大幅降低。增大,程序效率大幅降低。增大,程序效率大幅降低。436.5 结构体与函数构体与函数6.5.1 6.5.1 指向指向指向指向结结构体构体构体构体变变量的指量的指量的指量的指针针作函数参数作函数参数作函数参数作函数参数l l方法二:在函数之方法二:在函数之方法二:在函数之方法二:在函数之间传递结间传递结间传递结间传递结构体指构体指构体指构体指针针针针。形形形形参参参参定定定定义义为为指指指指向向向向结结结结构构构构体体体体类类类类型型型型的的的的指指指指针针针针变变量量量量,可可可可将将将将主主主主调调调调函函函函数数数数的的的的结结结结构构构构体体体体指指指指针针针针传
46、传传传递递递递给给给给被被被被调调调调函函函函数数数数的的的的形形形形参参参参变变量量量量,通通通通过过过过指指指指针针针针形形形形参参参参的的的的指指指指向向向向域域域域的的的的扩扩扩扩展展展展,操操操操作作作作主主主主调调调调函函函函数中数中数中数中结结结结构体构体构体构体变变变变量及其成量及其成量及其成量及其成员员员员。l l方法三:利用方法三:利用方法三:利用方法三:利用全局全局全局全局结结结结构体构体构体构体变变变变量量量量传递结传递结传递结传递结构体数据。构体数据。构体数据。构体数据。446.5 结构体与函数构体与函数6.5.1 6.5.1 指向指向指向指向结结构体构体构体构体变变
47、量的指量的指量的指量的指针针作函数参数作函数参数作函数参数作函数参数 【例例例例6 6.7 7】在在在在studentstudent结结构构构构体体体体类类型型型型中中中中增增增增加加加加一一一一个个个个成成成成员员rankrank,如如如如 果果果果 成成成成 绩绩 scorescore大大大大 于于于于 或或或或 等等等等 于于于于 6060,rankrank的的的的 值值 为为“SUCCESS”SUCCESS”,否,否,否,否则则rankrank的的的的值为值为“FAIL”FAIL”。struct studentstruct student int num;int num;char*na
48、me;char*name;char sex;char sex;float score;float score;char*rank;char*rank;456.5 结构体与函数构体与函数6.5.1 6.5.1 指向指向指向指向结结构体构体构体构体变变量的指量的指量的指量的指针针作函数参数作函数参数作函数参数作函数参数void grade(struct student*p)void grade(struct student*p)/*/*根据学生的分数返根据学生的分数返根据学生的分数返根据学生的分数返回不同的回不同的回不同的回不同的值值*/if(p-scorerank=FAIL;if(p-score
49、rank=FAIL;else else p-rank=SUCCESS;p-rank=SUCCESS;void print(struct student s)void print(struct student s)printf(num=%dnname=%snsex=%cnscore=%fnprintf(num=%dnname=%snsex=%cnscore=%fnrank=%snn,s.num,s.name,s.sex,rank=%snn,s.num,s.name,s.sex,s.score,s.rank);s.score,s.rank);void main()void main()int i;
50、int i;struct student stu1=102,Zhang ping,M,78.5;struct student stu1=102,Zhang ping,M,78.5;grade(&stu1);grade(&stu1);print(stu1);print(stu1);466.5结构体与函数构体与函数6 6.5.25.2结结构体构体构体构体变变量作量作量作量作为为函数的返回函数的返回函数的返回函数的返回值值 结构构体体变量量可可以以作作为函函数数的的返返回回值,具具有有结构构体体变量量返返回回值的的函函数数称称为结构构体体函函数数。在在函函数数定定义时,说明明返返回回值的的类型型为相