《第8章 第二讲 结构体指针、结构体做函数参数.ppt》由会员分享,可在线阅读,更多相关《第8章 第二讲 结构体指针、结构体做函数参数.ppt(11页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第8章 用户自定义数据类型 指针与结构8 85 51 1 指向结构体变量的指针变量指向结构体变量的指针变量指向结构体变量的指针变量指向结构体变量的指针变量 在定义一个结构体变量时,系统将在内存中分配一块连续的存储空在定义一个结构体变量时,系统将在内存中分配一块连续的存储空在定义一个结构体变量时,系统将在内存中分配一块连续的存储空在定义一个结构体变量时,系统将在内存中分配一块连续的存储空间,用于存放结构体成员的数据,这块连续存储空间的首地址称为结间,用于存放结构体成员的数据,这块连续存储空间的首地址称为结间,用于存放结构体成员的数据,这块连续存储空间的首地址称为结间,用于存放结构体成员的数据,这
2、块连续存储空间的首地址称为结构体变量的指针构体变量的指针构体变量的指针构体变量的指针(也称为结构体变量的首地址也称为结构体变量的首地址也称为结构体变量的首地址也称为结构体变量的首地址)。可以定义指向结构体。可以定义指向结构体。可以定义指向结构体。可以定义指向结构体变量的指针变量,若把某结构体变量的首地址赋值给一个指针变量,变量的指针变量,若把某结构体变量的首地址赋值给一个指针变量,变量的指针变量,若把某结构体变量的首地址赋值给一个指针变量,变量的指针变量,若把某结构体变量的首地址赋值给一个指针变量,则则则则称称称称这这这这一一一一指指指指针针针针变变变变量量量量指指指指向向向向该该该该结结结结
3、构构构构体体体体变变变变量量量量。指指指指向向向向结结结结构构构构体体体体的的的的指指指指针针针针变变变变量量量量定定定定义义义义格格格格式式式式是:是:是:是:structstruct 类型名类型名类型名类型名 *指针变量名;指针变量名;指针变量名;指针变量名;第8章 用户自定义数据类型 指针与结构如下面定义一个结构体类型如下面定义一个结构体类型如下面定义一个结构体类型如下面定义一个结构体类型booktpbooktp来存储书的基本信息:来存储书的基本信息:来存储书的基本信息:来存储书的基本信息:structstruct booktpbooktp char name60;char name60
4、;char author30;char author30;float price float price;structstruct datetpdatetp unsigned year unsigned year;unsigned monthunsigned month;pubdaypubday;可以定义结构体变量和指向结构体变量的指针可以定义结构体变量和指向结构体变量的指针可以定义结构体变量和指向结构体变量的指针可以定义结构体变量和指向结构体变量的指针:structstruct booktpbooktp book5 book5,*p p;第8章 用户自定义数据类型 指针与结构 以上定义了以上
5、定义了以上定义了以上定义了p p为指向结构体变量的指针变量。若为指向结构体变量的指针变量。若为指向结构体变量的指针变量。若为指向结构体变量的指针变量。若p p&book5&book5;,;,;,;,则称则称则称则称指针变量指针变量指针变量指针变量p p指向结构体变量指向结构体变量指向结构体变量指向结构体变量book5book5,此时可用下述三种方式之一存取结构此时可用下述三种方式之一存取结构此时可用下述三种方式之一存取结构此时可用下述三种方式之一存取结构体成员体成员体成员体成员(三种方式是等价的三种方式是等价的三种方式是等价的三种方式是等价的):1 1结构体变量名成员名结构体变量名成员名结构体
6、变量名成员名结构体变量名成员名 2 2指针变量名指针变量名指针变量名指针变量名 -成员名成员名成员名成员名 3 3(*(*指针变量名指针变量名指针变量名指针变量名)成员名成员名成员名成员名 其中其中其中其中 “-”是是是是 指向运算符指向运算符指向运算符指向运算符.如有下面程序段:如有下面程序段:如有下面程序段:如有下面程序段:structstructstructstruct booktpbooktpbooktpbooktp *p*p*p*p,book5book5book5book5 “C+BuiderC+BuiderC+BuiderC+Buider网网网网络络络络开开开开发发发发实实实实例例
7、例例”,”清清清清汉汉汉汉计计计计算算算算机机机机工工工工作作作作室室室室”,53535353,2000,92000,92000,92000,9;p p p p&book5&book5&book5&book5;则则则则book5book5book5book5.price price price price、p-price p-price p-price p-price 以及以及以及以及 (*p)(*p)(*p)(*p).price price price price 的值都是的值都是的值都是的值都是 535353530 0 0 0,而而而而book5book5book5book5.pubday
8、pubdaypubdaypubday.year year year year、p-p-p-p-pubday.yearpubday.yearpubday.yearpubday.year以及以及以及以及(*(*(*(*p).pubday.yearp).pubday.yearp).pubday.yearp).pubday.year 的值都是的值都是的值都是的值都是2000200020002000。注意此处注意此处注意此处注意此处(*p),price(*p),price(*p),price(*p),price的圆括号不能少的圆括号不能少的圆括号不能少的圆括号不能少.指针运算符指针运算符指针运算符指针运
9、算符“*”作用于指针变量作用于指针变量作用于指针变量作用于指针变量p p p p上,构成上,构成上,构成上,构成表达式表达式表达式表达式(*p)(*p)(*p)(*p),等价于结构体变量名等价于结构体变量名等价于结构体变量名等价于结构体变量名book5book5book5book5。第8章 用户自定义数据类型 指针与结构8 85 52 2 指向结构体数组的指针变量指向结构体数组的指针变量 指向结构体的指针变量也可以指向结构体数组及其元素。指向结构体的指针变量也可以指向结构体数组及其元素。例如,下述程序段:例如,下述程序段:structstruct booktpbooktp *p *p,book
10、3book3;p pbookbook;如图如图8 82020所示,图中假定所示,图中假定book0book0的地址是的地址是30003000,指针变量,指针变量p p指向结构体数指向结构体数组组bookbook的首地址,由于的首地址,由于sizeof(structsizeof(struct booktpbooktp)的值为的值为 9898,每个结构体元素,每个结构体元素占内存空间占内存空间9898个字节,因此个字节,因此p+lp+l指向地址指向地址30983098处,处,p+2p+2指向地址指向地址31963196处。处。98989898个字个字个字个字节节节节98989898个字个字个字个字
11、节节节节98989898个字个字个字个字节节节节p p p pp+1p+1p+1p+1p+2p+2p+2p+2300030003000300030983098309830983196319631963196book0book0book0book0book1book1book1book1book2book2book2book2图图图图8 82020 第8章 用户自定义数据类型 指针与结构 使用指针变量指向结构体变量或结构体数组时,应注意运算符的优先级:使用指针变量指向结构体变量或结构体数组时,应注意运算符的优先级:使用指针变量指向结构体变量或结构体数组时,应注意运算符的优先级:使用指针变量指向结
12、构体变量或结构体数组时,应注意运算符的优先级:1 1“()”、”、“-”、“”四四四四个个个个运运运运算算算算符符符符优优优优先先先先级级级级相相相相同同同同,在在在在C C语语语语言言言言中具有中具有中具有中具有最高的优先级,运算的结合方向是最高的优先级,运算的结合方向是最高的优先级,运算的结合方向是最高的优先级,运算的结合方向是“从左到右从左到右从左到右从左到右”;2 2“*”、“十十十十十十十十”、“一一一一一一一一”、“&”四个运算符优先级相同,在四个运算符优先级相同,在四个运算符优先级相同,在四个运算符优先级相同,在C C语语语语言优先言优先言优先言优先级的级别仅次于上述的四个运算符
13、,运算的结合方向是级的级别仅次于上述的四个运算符,运算的结合方向是级的级别仅次于上述的四个运算符,运算的结合方向是级的级别仅次于上述的四个运算符,运算的结合方向是“从右到左从右到左从右到左从右到左”。例例例例8 81616通过一个简单的例子说明指向结构体数组的指针的应用。在通过一个简单的例子说明指向结构体数组的指针的应用。在通过一个简单的例子说明指向结构体数组的指针的应用。在通过一个简单的例子说明指向结构体数组的指针的应用。在程序中,为了说明运算符的优先级和结合方向的用法,改变了书的价格。程序中,为了说明运算符的优先级和结合方向的用法,改变了书的价格。程序中,为了说明运算符的优先级和结合方向的
14、用法,改变了书的价格。程序中,为了说明运算符的优先级和结合方向的用法,改变了书的价格。main()main()structstruct datetpdatetp unsigned year unsigned year;unsigned monthunsigned month;*出版日期出版日期出版日期出版日期*第8章 用户自定义数据类型 指针与结构structstruct booktpbooktp char name60 char name60;*书名书名书名书名*char author30char author30;*作者作者作者作者*float pricefloat price;*价格价格
15、价格价格*structstruct datetpdatetp pubdaypubday;structstructstructstruct booktpbooktpbooktpbooktp *p *p *p *p,book3book3book3book3 “C+BuiderC+BuiderC+BuiderC+Buider网网网网络络络络开开开开发发发发实实实实例例例例”,”清清清清汉汉汉汉计计计计算算算算机机机机工工工工作作作作室室室室”,535353530 0 0 0,2000200020002000,9999,“SQLServerSQLServerSQLServerSQLServer循序渐进
16、教程循序渐进教程循序渐进教程循序渐进教程”,”PetkovicPetkovicPetkovicPetkovic”,353535350 0 0 0,1999199919991999,6666,“VBVBVBVB开发指南开发指南开发指南开发指南”,”DianneSieboldDianneSieboldDianneSieboldDianneSiebold”,282828280 0 0 0,2000200020002000,9999 ;p p p pbookbookbookbook;printfprintfprintfprintf(”8 8 8 82f2f2f2f,”,+p-price+p-price
17、+p-price+p-price);*橙色表达式等价于橙色表达式等价于橙色表达式等价于橙色表达式等价于+(p-price)*+(p-price)*+(p-price)*+(p-price)*第8章 用户自定义数据类型 指针与结构printfprintf(”8 8.2f2f,”,(+p)(+p)-priceprice);*先计算先计算先计算先计算+p+p+p+p,p p p p指向指向指向指向bookl*bookl*bookl*bookl*printfprintf(”8 8.2f2f,”,p+p+-priceprice);*上述表达式等价于上述表达式等价于上述表达式等价于上述表达式等价于(p+)
18、-price*(p+)-price*(p+)-price*(p+)-price*printfprintf(“(“8.2f8.2fn”n”,p p-price+price+);*上述表达式等价于上述表达式等价于上述表达式等价于上述表达式等价于(p-price)+*(p-price)+*(p-price)+*(p-price)+*for(pfor(pbookbook;pbook+3pname,(*p).author,p-p-name,(*p).author,p-pubday.yearpubday.year,p-p-pubday.monthpubday.month,p-price)p-price);
19、运行结果:运行结果:运行结果:运行结果:54540000,35350000,35350000,28280000 C+-C+-BuiderBuider网络开发实例舴者网络开发实例舴者网络开发实例舴者网络开发实例舴者:清汉计算机工作室清汉计算机工作室清汉计算机工作室清汉计算机工作室,出版日期出版日期出版日期出版日期:20002000年年年年9 9月月月月,价格:价格:价格:价格:54540 0 SQLServerSQLServer循序渐进教程,作者:循序渐进教程,作者:循序渐进教程,作者:循序渐进教程,作者:PetkovicPetkovic,出版日期:出版日期:出版日期:出版日期:19991999
20、年年年年6 6月,价格:月,价格:月,价格:月,价格:35350 0 VB VB开发指南,作者:开发指南,作者:开发指南,作者:开发指南,作者:DianneSieboldDianneSiebold,出版日期:出版日期:出版日期:出版日期:20002000年年年年9 9月,价格:月,价格:月,价格:月,价格:29290 0 运行程序运行程序运行程序运行程序第8章 结构体作为函数参数 例例例例8 81515#include#includeh structstruct st st intint a a;char bchar b;fun(structfun(struct st st bc)bc)bc
21、bca+a+5 5;bcbcb b AA;printfprintf(”被调函数中成员的值是:被调函数中成员的值是:被调函数中成员的值是:被调函数中成员的值是:d d,c c n n”,bcbc.a a,bcbc.b b);main()main()structstruct st st blbl;b1b1a=3a=3;b1b1b b cc;fun(b1)fun(b1);printfprintf(”主调函数中成员主调函数中成员主调函数中成员主调函数中成员 的值是:的值是:的值是:的值是:d d,c c n n”,”,”,”,b1 b1.a a,b1b1.b)b);运行结果:运行结果:运行结果:运行结
22、果:被调函数中成员的值是:被调函数中成员的值是:被调函数中成员的值是:被调函数中成员的值是:8 8,A A 主调函数中成员的值是:主调函数中成员的值是:主调函数中成员的值是:主调函数中成员的值是:3 3,c c 例例例例8 81616#include#includehstructstruct st st intint a a;char bchar b;main()main()structstruct st st b1 b1;b1b1.a a3 3;b1b1.b=cb=c;fun(&b1)fun(&b1);printfprintf(”d d,c c n n”,”,”,”,b1b1.a a,b1b
23、1.b)b);fun(structfun(struct st st*bpbp)bpbp-a+a+5 5;bpbp-bb AA;printfprintf(”d d,c c n n”,”,”,”,bpbp-a a,bpbp-b)b);运行结果:运行结果:运行结果:运行结果:8 8,A A 8 8,A A 例例例例8 81717#define N 3#define N 3 structstruct st st intint num num;char name7char name7;float scorefloat score;main()main()intint i;i;float float av
24、gavg,inpu_avg(structinpu_avg(struct st st*)*);structstruct st st studentN studentN;avgavginpu_avg(studentinpu_avg(student);*结构数组名作为函数的实参结构数组名作为函数的实参结构数组名作为函数的实参结构数组名作为函数的实参*printfprintf(”学号学号学号学号 姓名姓名姓名姓名 成绩成绩成绩成绩n n”);for(ifor(i0 0;iNiN;i+)i+)printfprintf(“4d4d7s7s6 6.1f1fn n”,studentistudenti.numn
25、um,studentistudenti.namename,studentistudenti.score)score);printfprintf(”平均成绩:平均成绩:平均成绩:平均成绩:4 41f1fn n”,avgavg);float float inpu_avg(structinpu_avg(struct st st*p)*p)intint i i;float tempfloat temp,avgavg0 00 0;for(i=0;iNfor(i=0;inumnum,(p+i)(p+i)-namename,&temp)&temp);(p+i)(p+i)-score scoretemptem
26、p;avgavg+=(p+i)+=(p+i)-score score;avgavgavgavgN N;return return avgavg;运行结果:运行结果:运行结果:运行结果:1 1 王王王王 军军军军 78780 0 2 2 吴晓兰吴晓兰吴晓兰吴晓兰 67670 0 3 3 张张张张 东东东东 92925 5 *以上是键盘输入以上是键盘输入以上是键盘输入以上是键盘输入*学号学号学号学号 姓名姓名姓名姓名 成绩成绩成绩成绩 1 1 王王王王 军军军军 78780 0 2 2 吴晓兰吴晓兰吴晓兰吴晓兰 67670 0 3 3 张张张张 东东东东 92925 5 平均成绩:平均成绩:平均成绩:平均成绩:79792 2