C-C++语言程序设计第6章-结构体用体和枚举教学课件

上传人:风*** 文档编号:240744978 上传时间:2024-05-04 格式:PPT 页数:75 大小:673.50KB
返回 下载 相关 举报
C-C++语言程序设计第6章-结构体用体和枚举教学课件_第1页
第1页 / 共75页
C-C++语言程序设计第6章-结构体用体和枚举教学课件_第2页
第2页 / 共75页
C-C++语言程序设计第6章-结构体用体和枚举教学课件_第3页
第3页 / 共75页
点击查看更多>>
资源描述
1第第6章章 结构体、共用体与枚构体、共用体与枚举6.1 结构体构体类型的声明型的声明 6.2 结构体构体变量的定量的定义、引用和初始化、引用和初始化 6.3 结构体数构体数组6.4 结构体与指构体与指针6.5 结构体与函数构体与函数6.6 共用体共用体6.7 枚枚举类型型6.8 类型定型定义语句句typedef6.9 小小结2 一一一一个个个个学学学学生生生生的的的的信信信信息息息息有有有有学学学学号号号号、姓姓姓姓名名名名、性性性性别别、年年年年龄龄、住住住住址址址址、成成成成绩绩等。等。等。等。一一一一本本本本图图书书的的的的信信信信息息息息有有有有分分分分类类编编号号号号、书书名名名名、作作作作者者者者、出出出出版版版版社社社社、出版日期出版日期出版日期出版日期、价格价格价格价格、库库存量存量存量存量等。等。等。等。如何描述如何描述如何描述如何描述这这些些些些类类型不同的相关数据?型不同的相关数据?型不同的相关数据?型不同的相关数据?6 6.1.1 结构体构体类型的声明型的声明 信息管理信息管理结构体构体一种构造数据一种构造数据类型型结构体构体由若干不同由若干不同类型的数据型的数据项组成,成,构成构成结构体的各个数据构体的各个数据项称称为结构体成构体成员。3 6 6.1.1 结构体构体类型的声明型的声明结构体类型定义的一般形式:结构体类型定义的一般形式:结构体类型定义的一般形式:结构体类型定义的一般形式:lstruct为关关键字字,不不能能省略;省略;l结构构体体名名是是该结构构体体类型型的的名名称称,命命名名应符符合合标识符符的的定定义要要求。求。成成员可可以以是是任任何何类型型的的变量量,包包括括基基本本数数据据类型型和和构构造造数数据据类型型,如如整整型型、浮浮点点型型和和字字符符型型,数数组和和指指针等等,也也可可以以是是另另一一个个结构构体体类型型的的结构构体体变量量或或自身自身结构体的指构体的指针,还可以是共用体可以是共用体变量。量。struct 结构体名构体名 数据数据类型型1 成成员名名1;数据数据类型型2 成成员名名2;数据数据类型型n 成成员名名n;4例例6.1一个学生的基本信息由学号、姓名、性一个学生的基本信息由学号、姓名、性别、成成绩组成,声明相成,声明相应的的结构体构体类型。型。struct student int num;/*学号是整型学号是整型*/char name20;/*姓名是字符数姓名是字符数组类型型*/char sex;/*性性别是字符型是字符型*/float score;/*成成绩是是实型型*/;6 6.1.1 结构体构体类型的声明型的声明numnum4 4个字个字个字个字节节namename2 20 0个字个字个字个字节节sexsex1 1个字个字个字个字节节scorescore4 4个字个字个字个字节节56 6.1.1 结构体构体类型的声明型的声明例如例如例如例如图书类图书类型的定型的定型的定型的定义义:struct bookcardstruct bookcard char char num10;num10;/*/*图图书书分分分分类类编编号号号号是是是是字字字字符符符符数数数数组组类类型型型型*/*/char name30;char name30;/*/*书书名是字符数名是字符数名是字符数名是字符数组类组类型型型型*/*/char author30;char author30;/*/*作者是字符数作者是字符数作者是字符数作者是字符数组类组类型型型型*/*/char publisher60;char publisher60;/*/*出版社是字符数出版社是字符数出版社是字符数出版社是字符数组类组类型型型型*/*/float price;float price;/*/*价格是价格是价格是价格是单单精度精度精度精度实实型型型型*/*/int n int n;/*/*库库存量是整型存量是整型存量是整型存量是整型*/*/;6 6.1.1 结构体构体类型的声明型的声明例例例例6.2 6.2 在学生基本信息中增加出生在学生基本信息中增加出生在学生基本信息中增加出生在学生基本信息中增加出生日期,声明学生信息日期,声明学生信息日期,声明学生信息日期,声明学生信息结结构体构体构体构体类类型。型。型。型。struct datestruct date int year;int year;int month;int month;int day;int day;6struct student int num;char name20;char sex;struct date birthday;/*birthday成成员为date 结构体构体类型型*/float score;numnum4 4个字个字个字个字节节namename2 20 0个字个字个字个字节节sexsex1 1个字个字个字个字节节birthdaybirthdayyearyear4 4个字个字个字个字节节monthmonth 4 4个字个字个字个字节节dayday4 4个字个字个字个字节节scorescore4 4个字个字个字个字节节6 6.1.1 结构体构体类型的声明型的声明说说明:明:明:明:(1)(1)结结构体声明的位置,可以在函数内部,也可构体声明的位置,可以在函数内部,也可构体声明的位置,可以在函数内部,也可构体声明的位置,可以在函数内部,也可以在函数外部。在函数内部声明的以在函数外部。在函数内部声明的以在函数外部。在函数内部声明的以在函数外部。在函数内部声明的结结构体,只能在函构体,只能在函构体,只能在函构体,只能在函数内部使用;在函数外部声明的数内部使用;在函数外部声明的数内部使用;在函数外部声明的数内部使用;在函数外部声明的结结构体,其有效范构体,其有效范构体,其有效范构体,其有效范围围是从声明是从声明是从声明是从声明处处开始,直到它所在的源程序文件开始,直到它所在的源程序文件开始,直到它所在的源程序文件开始,直到它所在的源程序文件结结束。束。束。束。(2)(2)数据数据数据数据类类型相同的数据型相同的数据型相同的数据型相同的数据项项,既可逐个、逐行分,既可逐个、逐行分,既可逐个、逐行分,既可逐个、逐行分别别声明,也可以合并成一行声明。如例声明,也可以合并成一行声明。如例声明,也可以合并成一行声明。如例声明,也可以合并成一行声明。如例6.26.2中的日期中的日期中的日期中的日期结结构体构体构体构体类类型,也可改型,也可改型,也可改型,也可改为为如下声明形式:如下声明形式:如下声明形式:如下声明形式:struct datestruct date int year,month,day int year,month,day;76 6.1.1 结构体构体类型的声明型的声明(3)同一同一结构体构体类型中的各成型中的各成员不可以互相不可以互相重名,但不同重名,但不同结构体构体类型型间的成的成员可以重名。可以重名。成成员名可以和程序中的名可以和程序中的变量名相同,两者代表量名相同,两者代表不同的不同的对象,互不干象,互不干扰。如下声明是正确的:。如下声明是正确的:int x,y;/*基本数据基本数据类型型变量量*/struct point int x,y;/*结构体构体point中的一个成中的一个成员*/;86 6.1.1 结构体构体类型的声明型的声明(4)(4)结结构体中成构体中成构体中成构体中成员员的的的的类类型不能是被描述的型不能是被描述的型不能是被描述的型不能是被描述的结结构体本身。如下描述构体本身。如下描述构体本身。如下描述构体本身。如下描述是非法的:是非法的:是非法的:是非法的:struct invalidstruct invalid int n;int n;struct invalid iv;struct invalid iv;9若成若成若成若成员类员类型是描述的型是描述的型是描述的型是描述的结结构体本身的指构体本身的指构体本身的指构体本身的指针针是合法是合法是合法是合法的。如:的。如:的。如:的。如:struct invalid int n;struct invalid*iv;106.2 6.2 结构体构体变量的定量的定义、引用和初始化、引用和初始化 例如:例如:例如:例如:struct studentstruct student stu1,stu2,*p,stu10;stu1,stu2,*p,stu10;1.1.先定先定先定先定义结义结构体,再构体,再构体,再构体,再说说明明明明结结构体构体构体构体变变量。量。量。量。6 6.2.1 2.1 结结构体构体构体构体变变量的定量的定量的定量的定义义 struct 结构体名构体名 若干成若干成员说明明;struct 结构体名构体名 结构体构体变量名表量名表;116.2 6.2 结构体构体变量的定量的定义、引用和初始化、引用和初始化 也可以使用宏定也可以使用宏定也可以使用宏定也可以使用宏定义义用一个符号常量来用一个符号常量来用一个符号常量来用一个符号常量来表示一个表示一个表示一个表示一个结结构体构体构体构体类类型。例如:型。例如:型。例如:型。例如:#define#define STUSTU struct student struct studentstruct studentstruct student int num;int num;char name20;char name20;char sex;char sex;float score;float score;STUSTU stu1,stu2;stu1,stu2;6 6.2.1 2.1 结结构体构体构体构体变变量的定量的定量的定量的定义义 126.2 6.2 结构体构体变量的定量的定义、引用和初始化、引用和初始化2 2、在定、在定、在定、在定义结义结构体构体构体构体类类型的同型的同型的同型的同时时定定定定义变义变量量量量例如:例如:struct student int num;char name20;char sex;float score;stu1,stu2;6 6.2.1 2.1 结结构体构体构体构体变变量的定量的定量的定量的定义义 struct 结构体名构体名 若干成若干成员说明明 结构体构体变量名表量名表;136.2 6.2 结构体构体变量的定量的定义、引用和初始化、引用和初始化3 3、直接、直接、直接、直接说说明明明明结结构体构体构体构体类类型型型型变变量量量量 例如:例如:struct char name20;char sex;int num;float score;stu1,stu2;6 6.2.1 2.1 结结构体构体构体构体变变量的定量的定量的定量的定义义 struct 若干成若干成员说明明 结构体构体变量名表量名表;146.2 6.2 结构体构体变量的定量的定义、引用和初始化、引用和初始化注意:注意:l l结构构体体类型型与与结构构体体变量量是是两两个个不不同同的的概概念念,其其区区别如如同同int类型型与与int型型变量量的的区区别一一样。编译系系统不不为结构构体体类型型分分配配空空间,只只对结构构体体变量量分分配配空空间。结构构体体类型型变量量所所占占内内存存空空间是是各各成成员变量量所所占占内内存存单元元的的总和和,各各成成员间占占用用的的存存储单元元是是连续的。的。l l结构构体体变量量中中的的成成员可可以以单独独使使用用,它它的的作用与地位相当于普通作用与地位相当于普通变量。量。6 6.2.1 2.1 结结构体构体构体构体变变量的定量的定量的定量的定义义 156.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;a;“.”是分量运是分量运是分量运是分量运算符,运算级算符,运算级算符,运算级算符,运算级别最高。别最高。别最高。别最高。a.birthday.yeara.birthday.montha.birthday.day 结构体变量的各个成员可结构体变量的各个成员可结构体变量的各个成员可结构体变量的各个成员可进行何种运算,由该成员进行何种运算,由该成员进行何种运算,由该成员进行何种运算,由该成员的数据类型决定的数据类型决定的数据类型决定的数据类型决定 结构体变量名结构体变量名.成员名成员名166.2 6.2 结构体构体变量的定量的定义、引用和初始化、引用和初始化6 6.2.2 2.2 结结构体构体构体构体变变量引用量引用量引用量引用注意:注意:(1)不能将一个不能将一个结构体构体变量作量作为一个整体一个整体进行行输入和入和输出,只能出,只能对其成其成员操作。例如,下操作。例如,下列引用是非法的:列引用是非法的:printf(%d,%s,%c,%f,stu1);(2)所引用的成所引用的成员变量与其所属量与其所属类型的普通型的普通变量使用方法一量使用方法一样,可以,可以进行行该类型所允型所允许的的任何运算。任何运算。176.2 6.2 结构体构体变量的定量的定义、引用和初始化、引用和初始化6 6.2.2 2.2 结结构体构体构体构体变变量引用量引用量引用量引用(3)只有当两个只有当两个结构体构体变量具有完全相同的量具有完全相同的结构体构体类型型时,相互之,相互之间才可以整体才可以整体赋值。(4)在用在用scanf语句句输入入结构体构体变量的成量的成员时,输入表列同入表列同样要用地址。如:要用地址。如:scanf(%c,&stu1.sex);(5)如果成如果成员本身是另一个本身是另一个结构体构体变量,在引量,在引用用时则要用若干个成要用若干个成员运算符,一运算符,一级一一级地地找到最低的成找到最低的成员变量,而且只能量,而且只能对最低的成最低的成员变量量进行行赋值或者运算操作。或者运算操作。186.2 6.2 结构体构体变量的定量的定义、引用和初始化、引用和初始化6 6.2.3 2.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,78.5;stu1,stu2,stu3=102,Zhang ping,M,78.5;如果初如果初值个数少于个数少于结构体成构体成员个数,个数,则将无初将无初值对应的成的成员赋以以0 0值。如果初如果初值个数多于个数多于结构体成构体成员个数,个数,则编译出出错。struct struct 结构体名构体名 结构体变量结构体变量=初始化列表初始化列表;196.2 6.2 结构体构体变量的定量的定义、引用和初始化、引用和初始化6 6.2.3 2.3 结结构体构体构体构体变变量的初始化量的初始化量的初始化量的初始化void main()void main()stu1.num=102;stu1.num=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,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);206.3 结构体数构体数组6 6.3.1 3.1 结结构体数构体数构体数构体数组组的定的定的定的定义义 定定定定义结义结构体数构体数构体数构体数组组的方法也有三种方式:的方法也有三种方式:的方法也有三种方式:的方法也有三种方式:l l 先定先定先定先定义结义结构体构体构体构体类类型然后再定型然后再定型然后再定型然后再定义结义结构体数构体数构体数构体数组组;l l 在定在定在定在定义结义结构体构体构体构体类类型的同型的同型的同型的同时时定定定定义结义结构体数构体数构体数构体数组组;l l 在定在定在定在定义义无名无名无名无名结结构体构体构体构体类类型的同型的同型的同型的同时时定定定定义结义结构体数构体数构体数构体数组组。struct studentstruct student int num;int num;char name20;char name20;char sex;char sex;float score;float score;stu3;stu3;216.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);scanf(%c%f,&stui.sex,&stui.score);scanf(%c%f,&stui.sex,&stui.score);结构体数构体数组名名下下标.成成员名名226.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.5103Li fangF92.5236.3 结构体数构体数组6 6.3.3 3.3 结结构体数构体数构体数构体数组组的初始化的初始化的初始化的初始化元素的个数可以省略,根据元素的个数可以省略,根据赋初初值时结构构体常量的个数确定数体常量的个数确定数组元素的个数元素的个数。内内层的大括号只是的大括号只是为了了阅读程序的方便,程序的方便,可以省略。可以省略。结构体数构体数组名是名是结构体数构体数组存存储的首地的首地址,可以通址,可以通过数数组名利用指名利用指针法或下法或下标法法访问数数组元素。元素。246.3 结构体数构体数组6 6.3.3 3.3 结结构体数构体数构体数构体数组组的初始化的初始化的初始化的初始化【例例例例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,90,84,89,stu=1,David,80,78,92,2,Lily,90,84,89,3,Alice,79,78,96;3,Alice,79,78,96;256.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);/*输输入学生的入学生的入学生的入学生的编编号号号号*/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(*结构体指针变量结构体指针变量).成员名成员名 或:或:结构体指针变量结构体指针变量-成员名成员名 306.4 结构体与指构体与指针6 6.4 4 指向指向指向指向结结构体构体构体构体变变量的指量的指量的指量的指针针2.2.指针变量的引用指针变量的引用指针变量的引用指针变量的引用 pstu-num:得到:得到pstu指向的指向的结构体构体变量中量中的成的成员变量量num的的值。pstu-num+:得到:得到pstu指向的指向的结构体构体变量量中的成中的成员变量量num的的值,先使用,后使,先使用,后使num加加1。+pstu-num:得到:得到pstu指向的指向的结构体构体变量量中的成中的成员变量量num的的值,使,使num先加先加1,再,再使用。使用。316.4 结构体与指构体与指针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;326.4 结构体与指构体与指针6 6.4.1 4.1 指向指向指向指向结结构体构体构体构体变变量的指量的指量的指量的指针针void main()pstu=&stu1;printf(Number=%dnName=%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);336.4 结构体与指构体与指针6 6.4.2 4.2 指向指向指向指向结结构体构体构体构体类类型数型数型数型数组组的指的指的指的指针针1.1.指向结构体类型数组的指针的定义指向结构体类型数组的指针的定义指向结构体类型数组的指针的定义指向结构体类型数组的指针的定义 l l一一一一个个个个结结构构构构体体体体类类型型型型数数数数组组的的的的数数数数组组名名名名是是是是数数数数组组的的的的首首首首地地地地址址址址,结结构构构构体体体体指指指指针针变变量量量量可可可可以以以以指指指指向向向向一一一一个个个个结结构构构构体体体体数数数数组组,这这时时结结构构构构体体体体指指指指针变针变量的量的量的量的值值是整个是整个是整个是整个结结构体数构体数构体数构体数组组的首地址。的首地址。的首地址。的首地址。l l定定定定义义结结构构构构体体体体数数数数组组的的的的指指指指针针和和和和定定定定义义其其其其他他他他数数数数组组的的的的指指指指针针的的的的方方方方法是一法是一法是一法是一样样的的的的 346.4 结构体与指构体与指针6 6.4.2 4.2 指向指向指向指向结结构体构体构体构体类类型数型数型数型数组组的指的指的指的指针针【例】利用【例】利用【例】利用【例】利用结结构体指构体指构体指构体指针输针输出一出一出一出一组组化学化学化学化学元素名称及其原子量。元素名称及其原子量。元素名称及其原子量。元素名称及其原子量。struct list struct list 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.数组元素的引用数组元素的引用数组元素的引用数组元素的引用 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 Htab0tab01.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.0121835366.4 结构体与指构体与指针6 6.4.2 4.2 指向指向指向指向结结构体构体构体构体类类型数型数型数型数组组的指的指的指的指针针【例【例【例【例6 6.6 6】利用指利用指利用指利用指针变针变量量量量输输出出出出结结构体数构体数构体数构体数组组 。#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;376.4 结构体与指构体与指针6 6.4.2 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);386.4 结构体与指构体与指针6 6.4.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,指向下一个元素,指向下一个元素,指向下一个元素,指向下一个元素,然后得到下一个元素的然后得到下一个元素的然后得到下一个元素的然后得到下一个元素的numnum成成成成员员的的的的值值。(3 3)ps+-numps+-num,先得到,先得到,先得到,先得到psps所指的所指的所指的所指的numnum的的的的值值,然,然,然,然后使后使后使后使psps加加加加1 1,指向下一个元素。,指向下一个元素。,指向下一个元素。,指向下一个元素。396.4 结构体与指构体与指针6 6.4.2 4.2 指向指向指向指向结结构体构体构体构体类类型数型数型数型数组组的指的指的指的指针针 分析自增自减运算分析自增自减运算分析自增自减运算分析自增自减运算对对程序程序程序程序结结果的影响。果的影响。果的影响。果的影响。struct code int i;char c;a=100,A,200,B,300,C,400,D;a a a a数数数数组组100100a0a0 AA200200a1a1 BB300300a2a2 CC400400a3a3 DD406.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(%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 DD301101B200D300301416.5 结构体与函数构体与函数6.5.1 6.5.1 指向指向指向指向结结构体构体构体构体变变量的指量的指量的指量的指针针作函数参数作函数参数作函数参数作函数参数l l方法一:在函数之方法一:在函数之方法一:在函数之方法一:在函数之间间直接直接直接直接传递结传递结构体数据。构体数据。构体数据。构体数据。函函函函数数数数的的的的形形形形参参参参定定定定义义为为结结构构构构体体体体变变量量量量。函函函函数数数数调调用用用用时时,可可可可将将将将主主主主调调函函函函数数数数的的的的结结构构构构体体体体类类型型型型实实参参参参传传递递给给被被被被调调函函函函数数数数的的的的形参形参形参形参。如如如如果果果果将将将将函函函函数数数数定定定定义义为为结结构构构构体体体体类类型型型型函函函函数数数数,可可可可利利利利用用用用returnreturn语语句句句句将将将将一一一一个个个个结结构构构构体体体体数数数数据据据据结结果果果果返返返返回回回回到到到到主主主主调调函函函函数数数数中中中中。这这一一一一过过程程程程无无无无论论在在在在空空空空间间上上上上还还是是是是在在在在时时间间上上上上都都都都为为系系系系统统增增增增加加加加了了了了开开开开销销,尤尤尤尤其其其其当当当当结结构构构构体体体体变变量量量量含含含含有有有有很很很很多多多多成成成成员员时时,系系系系统统开开开开销销急急急急剧剧增大,程序效率大幅降低。增大,程序效率大幅降低。增大,程序效率大幅降低。增大,程序效率大幅降低。426.5 结构体与函数构体与函数6.5.1 6.5.1 指向指向指向指向结结构体构体构体构体变变量的指量的指量的指量的指针针作函数参数作函数参数作函数参数作函数参数l l方法二:在函数之方法二:在函数之方法二:在函数之方法二:在函数之间传递结间传递结构体指构体指构体指构体指针针。形形形形参参参参定定定定义义为为指指指指向向向向结结构构构构体体体体类类型型型型的的的的指指指指针针变变量量量量,可可可可将将将将主主主主调调函函函函数数数数的的的的结结构构构构体体体体指指指指针针传传递递给给被被被被调调函函函函数数数数的的的的形形形形参参参参变变量量量量,通通通通过过指指指指针针形形形形参参参参的的的的指指指指向向向向域域域域的的的的扩扩展展展展,操操操操作作作作主主主主调调函函函函数中数中数中数中结结构体构体构体构体变变量及其成量及其成量及其成量及其成员员。l l方法三:利用方法三:利用方法三:利用方法三:利用全局全局全局全局结结构体构体构体构体变变量量量量传递结传递结构体数据。构体数据。构体数据。构体数据。436.5 结构体与函数构体与函数6.5.1 6.5.1 指向指向指向指向结结构体构体构体构体变变量的指量的指量的指量的指针针作函数参数作函数参数作函数参数作函数参数 【例例例例6 6.7 7】在在在在studentstudent结结构构构构体体体体类类型型型型中中中中增增增增加加加加一一一一个个个个成成成成员员rankrank,如如如如 果果果果 成成成成 绩绩 scorescore大大大大 于于于于 或或或或 等等等等 于于于于 6060,rankrank的的的的 值值 为为“SUCCESS”SUCCESS”,否,否,否,否则则rankrank的的的的值为值为“FAIL”FAIL”。struct studentstruct student int num;int num;char*name;char*name;char sex;char sex;float score;float score;char*rank;char*rank;446.5 结构体与函数构体与函数6.5.1 6.5.1 指向指向指向指向结结构体构体构体构体变变量的指量的指量的指量的指针针作函数参数作函数参数作函数参数作函数参数void grade(struct student*p)void grade(struct student*p)/*/*根据学生的分数返根据学生的分数返根据学生的分数返根据学生的分数返回不同的回不同的回不同的回不同的值值*/if(p-scorerank=FAIL;if(p-scorerank=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;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);456.5结构体与函数构体与函数6 6.5.25.2结结构体构体构体构体变变量作量作量作量作为为函数的返回函数的返回函数的返回函数的返回值值 结构构体体变量量可可以以作作为函函数数的的返返回回值,具具有有结构构体体变量量返返回回值的的函函数数称称为结构构体体函函数数。在在函函数数定定义时,说明明返返回回值的的类型型为相相应的的结构构体体类型型,就就可可以以通通过return语句使句使该函数返回函数返回结构体构体类型型值。466.5结构体与函数构体与函数6 6.5.25.2结结构体构体构体构体变变量作量作量作量作为为函数的返回函数的返回函数的返回函数的返回值值【例例6.8】求求n个学生中成个学生中成绩最高的学生最高的学生的信息并的信息并输出。出。#include stdio.hstruct student int num;char*name;char sex;float score;476.5结构体与函数构体与函数6 6.5.25.2结结构体构体构体构体变变量作量作量作量作为为函数的返回函数的返回函数的返回函数的返回值值 struct student fun(struct student*pstud,int n)struct student fun(struct student*pstud,int n)struct student*p,*p_max,*p_end;struct student*p,*p_max,*p_end;int j;int j;float max=0;float max=0;p=pstud;p=pstud;p_max=p;p_max=p;p_end=p+n;p_end=p+n;for(;pp_end;p+)for(;pscoremax)if(p-scoremax)max=p-score;p_max=p;max=p-score;p_max=p;return(*p_max);return(*p_max);486.5结构体与函数构体与函数6 6.5.25.2结结构体构体构体构体变变量作量作量作量作为为函数的返回函数的返回函数的返回函数的返回值值 void main()void main()int i,j;int i,j;struct student pp,stu=101,Zhao struct student pp,stu=101,Zhao lei,M,45,102,Sun hui,M,62.5,lei,M,45,102,Sun hui,M,62.5,103,Lifang,F,92.5,104,Wang 103,Lifang,F,92.5,104,Wang hua,F,89.5;hua,F,89.5;pp=fun(stu,4);pp=fun(stu,4);printf(%d%-10s%3c%5.1fn,pp.num,printf(%d%-10s%3c%5.1fn,pp.num,pp.name,pp.sex,pp.score);pp.name,pp.sex,pp.score);49 共共共共用用用用体体体体可可可可以以以以包包包包括括括括数数数数目目目目固固固固定定定定、类类型型型型不不不不同同同同的的的的若若若若干干干干数数数数据据据据。所所所所有有有有成成成成员员共共共共享享享享一一一一段段段段公公公公共共共共存存存存储储空空空空间间。所所所所谓谓的的的的共共共共享享享享不不不不是是是是指指指指把把把把多多多多个个个个成成成成员员同同同同时时装装装装入入入入一一一一个个个个共共共共用用用用体体体体变变量量量量内内内内,而而而而是是是是指指指指该该共共共共用体用体用体用体变变量可被量可被量可被量可被赋赋予任一成予任一成予任一成予任一成员值员值,但每次只能,但每次只能,但每次只能,但每次只能赋赋一种一种一种一种值值。共用体共用体共用体共用体类类型型型型变变量量量量所占内存空所占内存空所占内存空所占内存空间间不是各个成不是各个成不是各个成不是各个成员员所需所需所需所需存存存存储储空空空空间间字字字字节节数的数的数的数的总总和,而是共用体成和,而是共用体成和,而是共用体成和,而是共用体成员员中存中存中存中存储储空空空空间间最大的成最大的成最大的成最大的成员员所要求的字所要求的字所要求的字所要求的字节节数数数数。6.6 共用体共用体 6 6.6.1 6.1 共用体共用体共用体共用体类类型的声明型的声明型的声明型的声明由于共享的特性,由于共享的特性,只有最新存只有最新存储的的数据是有效的。数据是有效的。506.6 共用体共用体6 6.6.1 6.1 共用体共用体共用体共用体类类型的声明型的声明型的声明型的声明共用体类型声明的一般形式:共用体类型声明的一般形式:共用体类型声明的一般形式:共用体类型声明的一般形式:lunion为关关键字;字;l共共用用体体名名是是用用户定定义的的类型型标识。l 中中是是组成成该共共用用体体的的成成员。成成员的的数数据据类型型可可以以是是C语言言所所允允许的任何数据的任何数据类型。型。union 共用体名共用体名 数据数据类型型1 成成员名名1;数据数据类型型2 成成员名名2;数据数据类型型n 成成员名名n;51例如:例如:例如:例如:union dataunion data int stud int stud;char teach 10 char teach 10;6.6 共用体共用体6 6.6.1 6.1 共用体共用体共用体共用体类类型的声明型的声明型的声明型的声明声明了一个声明了一个union data共用体共用体类型,共用型,共用体体类型定型定义不分配内存空不分配内存空间,只是,只是说明此明此类型型数据的数据的组成情况。成情况。526.6 共用体共用体6 6.6.2 6.2 共用体共用体共用体共用体变变量的定量的定量的定量的定义义 1 1、先定、先定、先定、先定义义共用体共用体共用体共用体类类型,再定型,再定型,再定型,再定义义共用体共用体共用体共用体类类型型型型变变量量量量例如:例如:例如:例如:union dataunion data int stud int stud;char teach 10 char teach 10;;union data un1,un2,un3 union data un1,un2,un3;union 共用体名共用体名 变量名表变量名表;536.6 共用体共用体6 6.6.2 6.2 共用体共用体共用体共用体变变量的定量的定量的定量的定义义 2 2、在定、在定、在定、在定义义共用体共用体共用体共用体类类型的同型的同型的同型的同时时定定定定义变义变量量量量例如:例如:union data union data int stud int stud;char teach 10;char teach 10;un1,un2,un3 un1,un2,un3;union union 共用体名共用体名 成成员定定义表;表;变量名表变量名表;546.6 共用体共用体6 6.6.2 6.2 共用体共用体共用体共用体变变量的定量的定量的定量的定义义 3 3、直接定、直接定、直接定、直接定义义共用体共用体共用体共用体类类型型型型变变量量量量 例如:例如:union union int stud int stud;char teach 10;char teach 10;un1,un2,un3;un1,un2,un3;unionunion 成成员定定义表;表;变量名表变量名表;556.6 共用体共用体6 6.6.3 6.3 共用体共用体共用体共用体变变量的引用量的引用量的引用量的引用例如:例如:union uunion u char u1;char u1;int u2;int u2;x,*p=&x;x,*p=&x;用共用体用共用体变量名的引用形式:量名的引用形式:x.u1 x.u2x.u1 x.u2 用共用体指用共用体指针变量的引用形式:量的引用形式:(*(*p).u1 (*p).u2p).u1 (*p).u2 p-u1 p-u2 p-u1 p-u2共用体共用体变量名量名.成员名成员名指向共用体指向共用体变量的指量的指针名名-成员名成员名566.6 共用体共用体6 6.6.3 6.3 共用体共用体共用体共用体变变量的引用量的引用量的引用量的引用注意:注意:注意:注意:(1 1)共用体变量初始化)共用体变量初始化)共用体变量初始化)共用体变量初始化 union u union u char u1;char u1;int u2;int u2;main()main()union u a=0 x9741;union u a=0 x9741;printf(1.%c%xn,a.u1,a.u2);printf(1.%c%xn,a.u1,a.u2);a.u1=a;a.u1=a;printf(2.%c%xn,a.u1,a.u2);printf(2.%c%xn,a.u1,a.u2);共用体共用体类型型变量在定量在定义时只能只能对第一第一个成个成员进行行赋初初值。由于第一个成由于第一个成员是字符型,用一个字是字符型,用一个字节,所以,所以对于初于初值0 0 x9741仅能接受能接受0 0 x41,初初值的高字的高字节被截去。被截去。1.A 41A 412.a 61a 61对u2成成员的引的引用是无意用是无意义的的576.6 共用体共用体6 6.6 6.3 3 共用体共用体共用体共用体变变量的引用量的引用量的引用量的引用(2)不允不允许对共用体共用体变量名作量名作赋值或其他操作,也不或其他操作,也不能企能企图引用引用变量名来得到一个量名来得到一个值。un1=401;un1=401;/错误错误 un1=401,jsj08012;un1=401,jsj08012;/错误错误(3)共用体共用体变量的地址和它的各个成量的地址和它的各个成员变量的地址相量的地址相同同,&un1.stud&un1.stud、&un1.teach&un1.teach和和和和&un1&un1都是同一都是同一个地址。个地址。(4)一个共用体型的一个共用体型的变量可以用来存放几种不同量可以用来存放几种不同类型型的成的成员变量,但无法同量,但无法同时存放几种存放几种变量量,即每,即每一一时刻只有一个刻只有一个变量在起作用。量在起作用。586.6 共用体共用体6 6.6 6.3 3 共用体共用体共用体共用体变变量的引用量的引用量的引用量的引用(5)共用体共用体变量不能作函数参数,函
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 办公文档 > 教学培训


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!