《C语言程序设计教程第9章结构体与共用体.ppt》由会员分享,可在线阅读,更多相关《C语言程序设计教程第9章结构体与共用体.ppt(86页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第9 9章章 结构体与共用体结构体与共用体北京科技大学北京科技大学 计算机系计算机系C C 语言程序设计语言程序设计1第第9章章 结构体与共用体结构体与共用体9.1 9.1 9.1 9.1 结构体结构体结构体结构体9.2 9.2 9.2 9.2 共用体共用体共用体共用体9.3 9.3 9.3 9.3 枚举类型与类型命名枚举类型与类型命名枚举类型与类型命名枚举类型与类型命名2023/1/162 一一一一个个个个学学学学生生生生的的的的信信信信息息息息有有有有学学学学号号号号、姓姓姓姓名名名名、性性性性别别别别、年年年年龄龄龄龄、住住住住址址址址、成绩成绩成绩成绩等。等。等。等。一一一一本本本本
2、图图图图书书书书的的的的信信信信息息息息有有有有分分分分类类类类编编编编号号号号、书书书书名名名名、作作作作者者者者、出出出出版版版版社社社社、出版日期出版日期出版日期出版日期、价格价格价格价格、库存量库存量库存量库存量等。等。等。等。如何描述这些类型不同的相关数据?如何描述这些类型不同的相关数据?如何描述这些类型不同的相关数据?如何描述这些类型不同的相关数据?9.1 结构体结构体9.1.1 9.1.1 结构体与结构体类型的定义结构体与结构体类型的定义结构体与结构体类型的定义结构体与结构体类型的定义信息管理信息管理信息管理信息管理结构体结构体结构体结构体一种构造类型数据一种构造类型数据 结构体
3、结构体由若干不同类型的数据项组成,由若干不同类型的数据项组成,构成结构体的各个数据项称为构成结构体的各个数据项称为结构体成员结构体成员。2023/1/163 struct struct 结结结结构体名构体名构体名构体名 数据数据数据数据类类类类型型型型1 1 成成成成员员员员名名名名1;1;数据数据数据数据类类类类型型型型2 2 成成成成员员员员名名名名2;2;数据数据数据数据类类类类型型型型n n 成成成成员员员员名名名名n;n;9.1 结构体结构体9.1.1 9.1.1 结构体与结构体类型的定义结构体与结构体类型的定义结构体与结构体类型的定义结构体与结构体类型的定义结构体类型定义的一般形式
4、:结构体类型定义的一般形式:结构体类型定义的一般形式:结构体类型定义的一般形式:lstructstruct为关键字;为关键字;l结结构构体体名名是是用用户户定定义义的的类型标识类型标识。l 中中是是组组成成该该结结构构体体的的成成员员。成成员员的的数数据据类类型型可可以以是是C语语言言所所允允许的任何数据类型许的任何数据类型。2023/1/164例如图书类型的定义:例如图书类型的定义:例如图书类型的定义:例如图书类型的定义:struct bookcardstruct bookcard char num10;/*char num10;/*图书图书图书图书分类编号是字符数组类型分类编号是字符数组类
5、型分类编号是字符数组类型分类编号是字符数组类型*/*/char name30;/*char name30;/*书名是字符数组类型书名是字符数组类型书名是字符数组类型书名是字符数组类型*/*/char author30;/*char author30;/*作者是字符数组类型作者是字符数组类型作者是字符数组类型作者是字符数组类型*/*/char publisher60;/*char publisher60;/*出版社是字符数组类型出版社是字符数组类型出版社是字符数组类型出版社是字符数组类型*/*/float price;/*float price;/*价格是单精度实型价格是单精度实型价格是单精度实
6、型价格是单精度实型*/*/int n;/*int n;/*库存量是整型库存量是整型库存量是整型库存量是整型*/*/;例如学生类型的定义:例如学生类型的定义:struct student char num8;/*学号是学号是字符数组字符数组类型类型*/char name30;/*姓名是姓名是字符数组字符数组类型类型*/char sex;/*性别是性别是字符型字符型 */int age;/*年龄是年龄是整型整型 */char addr60;/*住址是住址是字符数组字符数组类型类型*/int score6;/*成绩是成绩是整型数组整型数组类型类型*/;9.1 结构体结构体9.1.1 9.1.1 结构
7、体与结构体类型的定义结构体与结构体类型的定义结构体与结构体类型的定义结构体与结构体类型的定义2023/1/1659.1 结构体结构体9.1.2 9.1.2 结构体变量的定义与初始化结构体变量的定义与初始化结构体变量的定义与初始化结构体变量的定义与初始化1.1.结构体类型变量的定义结构体类型变量的定义结构体类型变量的定义结构体类型变量的定义 l l利用已利用已利用已利用已定义的结构体类型名定义变量定义的结构体类型名定义变量定义的结构体类型名定义变量定义的结构体类型名定义变量 struct struct 结构体名结构体名结构体名结构体名 变量名表;变量名表;变量名表;变量名表;例如:例如:例如:例
8、如:struct bookcard struct bookcard book1100;book1100;struct student struct student s30,t1,t2;s30,t1,t2;按按照照结结构构体体类类型型的的组组成成,系系统统为为定定义义的的结结构构体体变变量量分分配配内内存存单单元元。结结构构体体变变量量的的各各个个成成员员在在内内存存中中占占用用连连续续存存储储区区域域,结结构构体体变变量量所所占占内内存存大大大大小小小小为为为为结构体中结构体中每个成员每个成员所占用内存的所占用内存的长度之和长度之和。struct studentstruct studentnu
9、mnum8 8个字节个字节个字节个字节namename3030个字节个字节个字节个字节sexsex1 1个字节个字节个字节个字节ageage2 2个字节个字节个字节个字节addraddr6060个字节个字节个字节个字节scorescore1212个字节个字节个字节个字节2023/1/1669.1 结构体结构体结构体类型与变量的说明结构体类型与变量的说明结构体类型与变量的说明结构体类型与变量的说明l l类型类型类型类型与与与与变量变量变量变量是不同的概念。是不同的概念。是不同的概念。是不同的概念。应先定义一个应先定义一个应先定义一个应先定义一个结构体类型结构体类型结构体类型结构体类型,而后再定义
10、,而后再定义,而后再定义,而后再定义结构体变量结构体变量结构体变量结构体变量。系统对系统对系统对系统对类型类型类型类型不分配空间,仅对不分配空间,仅对不分配空间,仅对不分配空间,仅对变量变量变量变量分配空间。分配空间。分配空间。分配空间。只能对只能对只能对只能对变量变量变量变量赋值、存取或运算,而不能对一个赋值、存取或运算,而不能对一个赋值、存取或运算,而不能对一个赋值、存取或运算,而不能对一个类型类型类型类型赋值、存取或运算。赋值、存取或运算。赋值、存取或运算。赋值、存取或运算。l l成员成员成员成员也可以是也可以是也可以是也可以是结构变量结构变量结构变量结构变量。l l对结构中的对结构中的
11、对结构中的对结构中的成员成员成员成员,可以单独使用,它的作用与,可以单独使用,它的作用与,可以单独使用,它的作用与,可以单独使用,它的作用与地位相当于地位相当于地位相当于地位相当于普通变量普通变量普通变量普通变量。l l成员名成员名成员名成员名可与程序中的变量名相同时,也可与可与程序中的变量名相同时,也可与可与程序中的变量名相同时,也可与可与程序中的变量名相同时,也可与不不不不同结构体类型的成员名相同,同结构体类型的成员名相同,同结构体类型的成员名相同,同结构体类型的成员名相同,二者代表不同的二者代表不同的二者代表不同的二者代表不同的对象。对象。对象。对象。struct date int ye
12、ar,month,day;struct student char num8;char name30;char sex;struct datestruct date birthday;/*成员为结构体类型成员为结构体类型*/char addr60;int score6;numnum8 8个字节个字节个字节个字节namename3030个字节个字节个字节个字节sexsex1 1个字节个字节个字节个字节birthdaybirthdayyearyear2 2个字节个字节个字节个字节monthmonth 2 2个字节个字节个字节个字节dayday2 2个字节个字节个字节个字节addraddr6060个字
13、节个字节个字节个字节scorescore1212个字节个字节个字节个字节2023/1/1679.1 结构体结构体9.1.2 9.1.2 结构体变量的定义与初始化结构体变量的定义与初始化结构体变量的定义与初始化结构体变量的定义与初始化1.1.结构体类型变量的定义结构体类型变量的定义结构体类型变量的定义结构体类型变量的定义 l l在定义结构体类型的同时定义变量在定义结构体类型的同时定义变量在定义结构体类型的同时定义变量在定义结构体类型的同时定义变量例如:例如:例如:例如:struct student struct student char num8,name20,sex;char num8,nam
14、e20,sex;int age;int age;float score;float score;st30;st30;struct struct 结构体名结构体名结构体名结构体名 成员定义表;成员定义表;成员定义表;成员定义表;变量名表;变量名表;变量名表;变量名表;2023/1/1689.1 结构体结构体9.1.2 9.1.2 结构体变量的定义与初始化结构体变量的定义与初始化结构体变量的定义与初始化结构体变量的定义与初始化1.1.结构体类型变量的定义结构体类型变量的定义结构体类型变量的定义结构体类型变量的定义 l l直接定义结构体类型变量直接定义结构体类型变量直接定义结构体类型变量直接定义结构
15、体类型变量 例如:例如:例如:例如:struct struct char num8,name20,sex;char num8,name20,sex;int age;int age;float score;float score;st30st30,a,b,c,a,b,c;struct struct 成员定义表;成员定义表;成员定义表;成员定义表;变量名表;变量名表;变量名表;变量名表;2023/1/1699.1 结构体结构体9.1.2 9.1.2 结构体变量的定义与初始化结构体变量的定义与初始化结构体变量的定义与初始化结构体变量的定义与初始化2.2.结构体变量的初始化结构体变量的初始化结构体变量
16、的初始化结构体变量的初始化 【例例例例9.49.4】结构体变量的初始化。】结构体变量的初始化。】结构体变量的初始化。】结构体变量的初始化。struct date struct date int year,month,day;int year,month,day;struct student struct student char num8,name20,sex;char num8,name20,sex;struct date birthday;struct date birthday;float score;float score;a=9606011,Li ming,M,1977,12,9,8
17、3,a=9606011,Li ming,M,1977,12,9,83,b=9608025,Zhang liming,F,1978,5,10,87,c;b=9608025,Zhang liming,F,1978,5,10,87,c;如果初值个数少于结构体成员个数,如果初值个数少于结构体成员个数,则将无初值对应的成员赋以则将无初值对应的成员赋以0值。值。如果初值个数多于结构体成员个数,如果初值个数多于结构体成员个数,则编译出错。则编译出错。2023/1/16109.1 结构体结构体9.1.2 9.1.2 结构体变量的定义与初始化结构体变量的定义与初始化结构体变量的定义与初始化结构体变量的定义与初始
18、化2.2.结构体变量的初始化结构体变量的初始化结构体变量的初始化结构体变量的初始化 【例【例【例【例9.59.5】结结结结构体数构体数构体数构体数组组组组的初始化。的初始化。的初始化。的初始化。struct s struct s char num8,name20,sex;char num8,name20,sex;float score;float score;stu3=9606011,Li ming,M,87.5,stu3=9606011,Li ming,M,87.5,9606012,Zhang jiangguo,M,79,9606012,Zhang jiangguo,M,79,9606013
19、,Wang ping,F,90;9606013,Wang ping,F,90;元素的个数可以省略,根据赋初值时元素的个数可以省略,根据赋初值时结构体常量的个数确定数组元素的个数结构体常量的个数确定数组元素的个数 2023/1/16119.1 结构体结构体9.1.2 9.1.2 结构体变量的定义与初始化结构体变量的定义与初始化结构体变量的定义与初始化结构体变量的定义与初始化3.3.结构体变量的运算结构体变量的运算结构体变量的运算结构体变量的运算 l l用用用用sizeofsizeof运算符计算结构体变量所占内存空间运算符计算结构体变量所占内存空间运算符计算结构体变量所占内存空间运算符计算结构体变
20、量所占内存空间 struct datestruct date int year,month,day;int year,month,day;struct studentstruct student char num8,name20,sex;char num8,name20,sex;struct date birthday;struct date birthday;float score;float score;a a;sizeof(sizeof(a a)的结果为的结果为的结果为的结果为8+20+1+6+4=398+20+1+6+4=39 sizeof(sizeof(struct students
21、truct student)的结果为的结果为的结果为的结果为3939 2023/1/16129.1 结构体结构体9.1.2 9.1.2 结构体变量的定义与初始化结构体变量的定义与初始化结构体变量的定义与初始化结构体变量的定义与初始化3.3.结构体变量的运算结构体变量的运算结构体变量的运算结构体变量的运算 l l同类型结构体变量之间的同类型结构体变量之间的同类型结构体变量之间的同类型结构体变量之间的赋值运算赋值运算赋值运算赋值运算结构体变量之间进行赋值时,系统将按成员一一对应赋值。结构体变量之间进行赋值时,系统将按成员一一对应赋值。结构体变量之间进行赋值时,系统将按成员一一对应赋值。结构体变量之
22、间进行赋值时,系统将按成员一一对应赋值。struct datestruct date int year,month,day;int year,month,day;struct studentstruct student char num8,name20,sex;char num8,name20,sex;struct date birthday;struct date birthday;float score;float score;a=9606011,Li ming,M,1977,12,9,83,b,c;a=9606011,Li ming,M,1977,12,9,83,b,c;c c=a;a;
23、2023/1/16139.1 结构体结构体9.1.2 9.1.2 结构体变量的定义与初始化结构体变量的定义与初始化结构体变量的定义与初始化结构体变量的定义与初始化3.3.结构体变量的运算结构体变量的运算结构体变量的运算结构体变量的运算 l l对结构体变量进行对结构体变量进行对结构体变量进行对结构体变量进行取址运算取址运算取址运算取址运算 struct datestruct date int year,month,day;int year,month,day;struct studentstruct student char num8,name20,sex;char num8,name20,se
24、x;struct date birthday;struct date birthday;float score;float score;a;a;对对对对结结结结构构构构体体体体变变变变量量量量a a进进进进行行行行&a a 运运运运算算算算,可可可可以以以以得得得得到到到到a a a a的的的的首首首首地址,它是结构体类型指针。地址,它是结构体类型指针。地址,它是结构体类型指针。地址,它是结构体类型指针。2023/1/16149.1 结构体结构体9.1.2 9.1.2 结构体变量的定义与初始化结构体变量的定义与初始化结构体变量的定义与初始化结构体变量的定义与初始化4.4.结构体变量成员的引用结
25、构体变量成员的引用结构体变量成员的引用结构体变量成员的引用 结构体变量成员引用的一般形式:结构体变量成员引用的一般形式:结构体变量成员引用的一般形式:结构体变量成员引用的一般形式:结构体变量名结构体变量名结构体变量名结构体变量名.成员名成员名成员名成员名 结结结结构构构构体体体体变变变变量量量量a a的的的的各各各各成成成成员员员员可可可可分分分分别别别别表表表表示示示示为为为为a a.numnum、a a.namename、a a.sexsex、a a.birthdaybirthday、a a.scorescore struct datestruct date int year,month,
26、day;int year,month,day;struct student struct student char num8,name20,sex;char num8,name20,sex;struct date birthday;struct date birthday;float score;float score;a;a;“.”是分量是分量是分量是分量运算符,运算运算符,运算运算符,运算运算符,运算级别最高。级别最高。级别最高。级别最高。a.birthday.yeara.birthday.montha.birthday.day 结构体变量的各个成员可结构体变量的各个成员可结构体变量的各个
27、成员可结构体变量的各个成员可进行何种运算,由该成员进行何种运算,由该成员进行何种运算,由该成员进行何种运算,由该成员的数据类型决定的数据类型决定的数据类型决定的数据类型决定 2023/1/16159.1 结构体结构体9.1.2 9.1.2 结构体变量的定义与初始化结构体变量的定义与初始化结构体变量的定义与初始化结构体变量的定义与初始化【例例例例9.69.6】编写一个统计选票的程序。】编写一个统计选票的程序。】编写一个统计选票的程序。】编写一个统计选票的程序。struct candidate struct candidate char name20;/*name char name20;/*na
28、me为候选人姓名为候选人姓名为候选人姓名为候选人姓名*/*/int count;/*countint count;/*count为候选人得票数为候选人得票数为候选人得票数为候选人得票数*/*/list list=invalid,0,Zhao,0,Qian,0,=invalid,0,Zhao,0,Qian,0,Sun,0,Li,0,Zhou,0;Sun,0,Li,0,Zhou,0;2023/1/16169.1 结构体结构体9.1.2 9.1.2 结构体变量的定义与初始化结构体变量的定义与初始化结构体变量的定义与初始化结构体变量的定义与初始化main()main()int i,n;int i,n;
29、printf(Enter voten);printf(Enter voten);scanf(%d,&n);scanf(%d,&n);/*/*输入所投候选人编号,编号从输入所投候选人编号,编号从输入所投候选人编号,编号从输入所投候选人编号,编号从1 1 1 1开始开始开始开始*/*/while(n!=-1)while(n!=-1)/*/*当输入编号为当输入编号为当输入编号为当输入编号为-1-1-1-1时,表示投票结束时,表示投票结束时,表示投票结束时,表示投票结束*/*/if(n=1&n=1&n=5)listn.count+;listn.count+;/*/*有效票,则相应候选人计票成员加有效票
30、,则相应候选人计票成员加有效票,则相应候选人计票成员加有效票,则相应候选人计票成员加1 1 1 1*/*/elseelse printf(invalidn);printf(invalidn);list0.count+;list0.count+;/*/*无效票无效票无效票无效票,list0list0的计票成员加的计票成员加的计票成员加的计票成员加1*/1*/scanf(%d,&n);scanf(%d,&n);/*/*输入所投候选人编号输入所投候选人编号输入所投候选人编号输入所投候选人编号*/*/2023/1/16179.1 结构体结构体9.1.2 9.1.2 结构体变量的定义与初始化结构体变量的
31、定义与初始化结构体变量的定义与初始化结构体变量的定义与初始化for(i=1;i=5;i+)for(i=1;i-year pyear p-month pmonth p-dayday“-”是指向结构体成员是指向结构体成员运算符,优先级为一级运算符,优先级为一级 p=&d.year2023/1/16209.1 结构体结构体9.1.3 9.1.3 结构体的指针结构体的指针结构体的指针结构体的指针 【例【例【例【例9_9_a a】输入今天的日期,然后输出该日期。输入今天的日期,然后输出该日期。输入今天的日期,然后输出该日期。输入今天的日期,然后输出该日期。main()main()struct dates
32、truct date /*/*/*/*在函数中定义结构体类型在函数中定义结构体类型在函数中定义结构体类型在函数中定义结构体类型*/*/*/*/int year,month,day;int year,month,day;today,today,*p=p=&today;today;/*/*/*/*定义结构体变量及其指针定义结构体变量及其指针定义结构体变量及其指针定义结构体变量及其指针*/*/*/*/printf(Enter today date(YYYY/MM/DD):);printf(Enter today date(YYYY/MM/DD):);scanf(%d/%d/%d,scanf(%d/%
33、d/%d,&todaytoday.year,year,&todaytoday.month,month,&todaytoday.day);day);printf(Today:%d/%d/%dn,p printf(Today:%d/%d/%dn,p-year,pyear,p-month,month,p p-day);day);2023/1/16219.1 结构体结构体9.1.3 9.1.3 结构体的指针结构体的指针结构体的指针结构体的指针3.3.指向结构体数组的指针指向结构体数组的指针指向结构体数组的指针指向结构体数组的指针 【例【例【例【例9.79.7】利用结构体指针输出一组化学】利用结构体指针
34、输出一组化学】利用结构体指针输出一组化学】利用结构体指针输出一组化学 元素名称及其原子量。元素名称及其原子量。元素名称及其原子量。元素名称及其原子量。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 2HeHetab1
35、tab14.00264.00263 3LiLitab2tab26.9416.9414 4BeBetab3tab39.012189.012182023/1/16229.1 结构体结构体9.1.3 9.1.3 结构体的指针结构体的指针结构体的指针结构体的指针3.3.指向结构体数组的指针指向结构体数组的指针指向结构体数组的指针指向结构体数组的指针 main()main()struct list *p;struct list *p;printf(NotNametAtomic Weightn);printf(NotNametAtomic Weightn);for(p=tab;ptab+4;p+)for(
36、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.012182023/1/16239.1 结构体结构体9.1.3 9.1.3 结构体的指针结构体的指针结构体的指针结构体的指针【
37、例例例例9.89.8】分析自增自减运算】分析自增自减运算】分析自增自减运算】分析自增自减运算对对对对程序程序程序程序结结结结果的影响。果的影响。果的影响。果的影响。struct code struct code int i;int i;char c;char c;a=100,A,200,B,a=100,A,200,B,300,C,400,D;300,C,400,D;a a a a数组数组数组数组100100a0a0 AA200200a1a1 BB300300a2a2 CC400400a3a3 DD2023/1/16249.1 结构体结构体9.1.3 9.1.3 结构体的指针结构体的指针结构体的
38、指针结构体的指针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
39、 BB300300a2a2 CC400400a3a3 DDp101 DD301101B200D3003012023/1/16259.1 结构体结构体9.1.4 9.1.4 函数间结构体数据的传递函数间结构体数据的传递函数间结构体数据的传递函数间结构体数据的传递l l方法一:在函数之方法一:在函数之方法一:在函数之方法一:在函数之间间间间直接直接直接直接传递结传递结传递结传递结构体数据。构体数据。构体数据。构体数据。函函函函数数数数的的的的形形形形参参参参定定定定义义义义为为为为结结结结构构构构体体体体变变变变量量量量。函函函函数数数数调调调调用用用用时时时时,可可可可将将将将主主主主调调调调函
40、函函函数数数数的的的的结结结结构构构构体体体体类类类类型型型型实实实实参参参参传传传传递递递递给给给给被被被被调调调调函函函函数数数数的的的的形参形参形参形参。如如如如果果果果将将将将函函函函数数数数定定定定义义义义为为为为结结结结构构构构体体体体类类类类型型型型函函函函数数数数,可可可可利利利利用用用用returnreturn语语语语句句句句将将将将一一一一个个个个结结结结构构构构体体体体数数数数据据据据结结结结果果果果返返返返回回回回到到到到主主主主调调调调函函函函数数数数中中中中。2023/1/16269.1 结构体结构体9.1.4 9.1.4 函数间结构体数据的传递函数间结构体数据的传
41、递函数间结构体数据的传递函数间结构体数据的传递l l方法二:在函数之方法二:在函数之方法二:在函数之方法二:在函数之间传递结间传递结间传递结间传递结构体指构体指构体指构体指针针针针。形形形形参参参参定定定定义义义义为为为为指指指指向向向向结结结结构构构构体体体体类类类类型型型型的的的的指指指指针针针针变变变变量量量量,可可可可将将将将主主主主调调调调函函函函数数数数的的的的结结结结构构构构体体体体指指指指针针针针传传传传递递递递给给给给被被被被调调调调函函函函数数数数的的的的形形形形参参参参变变变变量量量量,通通通通过过过过指指指指针针针针形形形形参参参参的的的的指指指指向向向向域域域域的的的
42、的扩扩扩扩展展展展,操操操操作作作作主主主主调调调调函函函函数中数中数中数中结结结结构体构体构体构体变变变变量及其成量及其成量及其成量及其成员员员员。如如如如果果果果将将将将函函函函数数数数定定定定义义义义为为为为结结结结构构构构体体体体指指指指针针针针型型型型函函函函数数数数,可可可可利利利利用用用用returnreturn语语语语句句句句将将将将被被被被调调调调函函函函数数数数中中中中结结结结构构构构体体体体变变变变量量量量的的的的指指指指针针针针返返返返回回回回给给给给主主主主调调调调函数的函数的函数的函数的结结结结构体指构体指构体指构体指针变针变针变针变量量量量。l l方法三:利用方法
43、三:利用方法三:利用方法三:利用全局全局全局全局结结结结构体构体构体构体变变变变量量量量传递结传递结传递结传递结构体数据。构体数据。构体数据。构体数据。2023/1/16279.1 结构体结构体9.1.4 9.1.4 函数间结构体数据的传递函数间结构体数据的传递函数间结构体数据的传递函数间结构体数据的传递 【例例例例9.99.9】编编编编制制制制一一一一个个个个复复复复数数数数乘乘乘乘法法法法函函函函数数数数,采采采采用用用用值值值值传传传传递递递递的的的的方方方方 法传送数据。法传送数据。法传送数据。法传送数据。struct complex /*struct complex /*定义存放复数
44、的结构体类型定义存放复数的结构体类型定义存放复数的结构体类型定义存放复数的结构体类型*/*/float re;/*refloat re;/*re成员用于存放复数的实部成员用于存放复数的实部成员用于存放复数的实部成员用于存放复数的实部*/*/float im;/*imfloat im;/*im成员用于存放复数的虚部成员用于存放复数的虚部成员用于存放复数的虚部成员用于存放复数的虚部*/*/;2023/1/16289.1 结构体结构体9.1.4 9.1.4 函数间结构体数据的传递函数间结构体数据的传递函数间结构体数据的传递函数间结构体数据的传递struct complex multiplier(st
45、ruct complex cx,struct complex multiplier(struct complex cx,struct complex cy)struct complex cy)struct complex cz;struct complex cz;cz.re=cx.re*cy.re-cx.im*cy.im;cz.re=cx.re*cy.re-cx.im*cy.im;cz.im=cx.re*cy.im+cx.im*cy.re;cz.im=cx.re*cy.im+cx.im*cy.re;return(cz);return(cz);形参是结构体变量。调用此函数时,形参是结构体变量。调
46、用此函数时,系统将分别为形参系统将分别为形参cx和和cy各分配一个各分配一个sizeof(struct complex)大小的内存空间,大小的内存空间,每个成员都要一一传递。每个成员都要一一传递。2023/1/16299.1 结构体结构体9.1.4 9.1.4 函数间结构体数据的传递函数间结构体数据的传递函数间结构体数据的传递函数间结构体数据的传递main()main()struct complex x,y,z;struct complex x,y,z;x.re=3.2;x.re=3.2;x.im=1.5;x.im=1.5;y.re=2.7;y.re=2.7;y.im=4.6;y.im=4.6
47、;z=multiplier(x,y);z=multiplier(x,y);printf(%f+%fin,z.re,z.im);/*printf(%f+%fin,z.re,z.im);/*以复数形式输出以复数形式输出以复数形式输出以复数形式输出*/*/2023/1/16309.1 结构体结构体9.1.4 9.1.4 函数间结构体数据的传递函数间结构体数据的传递函数间结构体数据的传递函数间结构体数据的传递 【例例例例9.109.10】编编编编制制制制一一一一个个个个复复复复数数数数乘乘乘乘法法法法函函函函数数数数,采采采采用用用用传传传传递递递递指指指指针针针针 的方法达到传送数据的目的。的方法达
48、到传送数据的目的。的方法达到传送数据的目的。的方法达到传送数据的目的。struct complex struct complex float re,im;float re,im;void multiplier(struct complex*px,void multiplier(struct complex*px,struct complex*py,struct complex*pz)struct complex*py,struct complex*pz)pz-re=px-re*py-re-px-im*py-im;pz-re=px-re*py-re-px-im*py-im;pz-im=px-re
49、*py-im+px-im*py-re;pz-im=px-re*py-im+px-im*py-re;形参定义为指针型参数。函数调用时,实参传递的形参定义为指针型参数。函数调用时,实参传递的是结构体指针(地址),因此形参是结构体指针(地址),因此形参px、py可读取主调函可读取主调函数中变量的内容,乘积结果也可通过形参数中变量的内容,乘积结果也可通过形参pz指针存到主指针存到主调函数中的目标变量。调函数中的目标变量。这样实参与形参之间的数据传递由多值(每个成员的值)这样实参与形参之间的数据传递由多值(每个成员的值)变成了单值(结构体变量的首地址)。变成了单值(结构体变量的首地址)。2023/1/1
50、6319.1 结构体结构体9.1.4 9.1.4 函数间结构体数据的传递函数间结构体数据的传递函数间结构体数据的传递函数间结构体数据的传递main()main()struct complex x,y,z;struct complex x,y,z;x.re=3.2;x.re=3.2;x.im=1.5;x.im=1.5;y.re=2.7;y.re=2.7;y.im=4.6;y.im=4.6;multiplier(&x,&y,&z);multiplier(&x,&y,&z);printf(%f+%fi)*(%f+%fi)=%f+%fin,x.re,x.im,printf(%f+%fi)*(%f+%f