《结构体指针、结构体做函数参数.ppt》由会员分享,可在线阅读,更多相关《结构体指针、结构体做函数参数.ppt(11页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第8章 用户自定义数据类型 指针与结构8 85 51 1 指向结构体变量的指针变量指向结构体变量的指针变量指向结构体变量的指针变量指向结构体变量的指针变量 在定义一个结构体变量时,系统将在内存中分配一块连续的存储空在定义一个结构体变量时,系统将在内存中分配一块连续的存储空在定义一个结构体变量时,系统将在内存中分配一块连续的存储空在定义一个结构体变量时,系统将在内存中分配一块连续的存储空间,用于存放结构体成员的数据,这块连续存储空间的首地址称为结间,用于存放结构体成员的数据,这块连续存储空间的首地址称为结间,用于存放结构体成员的数据,这块连续存储空间的首地址称为结间,用于存放结构体成员的数据,这
2、块连续存储空间的首地址称为结构体变量的指针构体变量的指针构体变量的指针构体变量的指针(也称为结构体变量的首地址也称为结构体变量的首地址也称为结构体变量的首地址也称为结构体变量的首地址)。可以定义指向结构体。可以定义指向结构体。可以定义指向结构体。可以定义指向结构体变量的指针变量,若把某结构体变量的首地址赋值给一个指针变量,变量的指针变量,若把某结构体变量的首地址赋值给一个指针变量,变量的指针变量,若把某结构体变量的首地址赋值给一个指针变量,变量的指针变量,若把某结构体变量的首地址赋值给一个指针变量,则则则则称称称称这这这这一一一一指指指指针针针针变变变变量量量量指指指指向向向向该该该该结结结结
3、构构构构体体体体变变变变量量量量。指指指指向向向向结结结结构构构构体体体体的的的的指指指指针针针针变变变变量量量量定定定定义义义义格格格格式式式式是:是:是:是:struct struct 类型名类型名类型名类型名 *指针变量名;指针变量名;指针变量名;指针变量名;第8章 用户自定义数据类型 指针与结构如下面定义一个结构体类型如下面定义一个结构体类型如下面定义一个结构体类型如下面定义一个结构体类型booktpbooktp来存储书的基本信息:来存储书的基本信息:来存储书的基本信息:来存储书的基本信息:struct booktp struct booktp char name60;char nam
4、e60;char author30;char author30;float price float price;struct datetpstruct datetp unsigned year unsigned year;unsigned month unsigned month;pubday pubday;可以定义结构体变量和指向结构体变量的指针可以定义结构体变量和指向结构体变量的指针可以定义结构体变量和指向结构体变量的指针可以定义结构体变量和指向结构体变量的指针:struct booktp book5struct booktp book5,*p*p;第8章 用户自定义数据类型 指针与结构
5、以上定义了以上定义了以上定义了以上定义了p p为指向结构体变量的指针变量。若为指向结构体变量的指针变量。若为指向结构体变量的指针变量。若为指向结构体变量的指针变量。若p p&book5&book5;,则称;,则称;,则称;,则称指针变量指针变量指针变量指针变量p p指向结构体变量指向结构体变量指向结构体变量指向结构体变量book5book5,此时可用下述三种方式之一存取结构,此时可用下述三种方式之一存取结构,此时可用下述三种方式之一存取结构,此时可用下述三种方式之一存取结构体成员体成员体成员体成员(三种方式是等价的三种方式是等价的三种方式是等价的三种方式是等价的):1 1结构体变量名成员名结构
6、体变量名成员名结构体变量名成员名结构体变量名成员名 2 2指针变量名指针变量名指针变量名指针变量名-成员名成员名成员名成员名 3 3(*(*指针变量名指针变量名指针变量名指针变量名)成员名成员名成员名成员名 其中其中其中其中“-“-“-“-”是是是是 指向运算符指向运算符指向运算符指向运算符.如有下面程序段:如有下面程序段:如有下面程序段:如有下面程序段:struct struct struct struct booktp booktp booktp booktp*p*p*p*p,book5book5book5book5“C+Buider“C+Buider“C+Buider“C+Buider网
7、网网网络络络络开开开开发发发发实实实实例例例例”,”清清清清汉汉汉汉计计计计算算算算机机机机工工工工作作作作室室室室”,53 53 53 53,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,而而而而boo
8、k5book5book5book5.pubdaypubdaypubdaypubday.year year year year、p-pubday.yearp-pubday.yearp-pubday.yearp-pubday.year以及以及以及以及(*p).pubday.year(*p).pubday.year(*p).pubday.year(*p).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 指向结构体数组的指针变量指向结构体数组的指针变量 指向结构体的指针变量也可以指向结构体数组及其元素。指向结构体的指针变量也可以指向结构体数组及其元素。例如,下述程序段:例如,下述程序段:
10、struct booktp *p struct booktp *p,book3book3;p pbookbook;如图如图8 82020所示,图中假定所示,图中假定book0book0的地址是的地址是30003000,指针变量,指针变量p p指向结构体数指向结构体数组组bookbook的首地址,由于的首地址,由于sizeof(struct booktp)sizeof(struct booktp)的值为的值为 98 98,每个结构体元素,每个结构体元素占内存空间占内存空间9898个字节,因此个字节,因此p+lp+l指向地址指向地址30983098处,处,p+2p+2指向地址指向地址3196319
11、6处。处。98989898个字个字个字个字节节节节98989898个字个字个字个字节节节节98989898个字个字个字个字节节节节p p p pp+1p+1p+1p+1p+2p+2p+2p+2300030003000300030983098309830983196319631963196book0book0book0book0book1book1book1book1book2book2book2book2图图图图8 82020 第8章 用户自定义数据类型 指针与结构 使用指针变量指向结构体变量或结构体数组时,应注意运算符的优先级:使用指针变量指向结构体变量或结构体数组时,应注意运算符的优先级:
12、使用指针变量指向结构体变量或结构体数组时,应注意运算符的优先级:使用指针变量指向结构体变量或结构体数组时,应注意运算符的优先级:1 1“()”、”、“-“-“-“-”、“”四四四四个个个个运运运运算算算算符符符符优优优优先先先先级级级级相相相相同同同同,在在在在C C语语语语言言言言中具有中具有中具有中具有最高的优先级,运算的结合方向是最高的优先级,运算的结合方向是最高的优先级,运算的结合方向是最高的优先级,运算的结合方向是“从左到右从左到右从左到右从左到右”;2 2“*”、“十十十十十十十十”、“一一一一一一一一”、“&”四个运算符优先级相同,在四个运算符优先级相同,在四个运算符优先级相同,
13、在四个运算符优先级相同,在C C语语语语言优先言优先言优先言优先级的级别仅次于上述的四个运算符,运算的结合方向是级的级别仅次于上述的四个运算符,运算的结合方向是级的级别仅次于上述的四个运算符,运算的结合方向是级的级别仅次于上述的四个运算符,运算的结合方向是“从右到左从右到左从右到左从右到左”。例例例例8 81616通过一个简单的例子说明指向结构体数组的指针的应用。在通过一个简单的例子说明指向结构体数组的指针的应用。在通过一个简单的例子说明指向结构体数组的指针的应用。在通过一个简单的例子说明指向结构体数组的指针的应用。在程序中,为了说明运算符的优先级和结合方向的用法,改变了书的价格。程序中,为了
14、说明运算符的优先级和结合方向的用法,改变了书的价格。程序中,为了说明运算符的优先级和结合方向的用法,改变了书的价格。程序中,为了说明运算符的优先级和结合方向的用法,改变了书的价格。main()main()struct datetp struct datetp unsigned year unsigned year;unsigned month unsigned month;*出版日期出版日期出版日期出版日期*第8章 用户自定义数据类型 指针与结构struct booktpstruct booktp char name60 char name60;*书名书名书名书名*char author30
15、char author30;*作者作者作者作者*float price float price;*价格价格价格价格*struct datetp pubday struct datetp pubday;struct booktp *pstruct booktp *pstruct booktp *pstruct booktp *p,book3book3book3book3 “C+Buider“C+Buider“C+Buider“C+Buider网网网网络络络络开开开开发发发发实实实实例例例例”,”清清清清汉汉汉汉计计计计算算算算机机机机工工工工作作作作室室室室”,535353530 0 0 0,2
16、000200020002000,9999,“SQLServer “SQLServer “SQLServer “SQLServer循序渐进教程循序渐进教程循序渐进教程循序渐进教程”,”Petkovic”Petkovic”Petkovic”Petkovic”,353535350 0 0 0,1999199919991999,6666,“VB “VB “VB “VB开发指南开发指南开发指南开发指南”,”DianneSiebold”DianneSiebold”DianneSiebold”DianneSiebold”,282828280 0 0 0,2000200020002000,9999 ;p p
17、p pbookbookbookbook;printf(”printf(”printf(”printf(”8 8 8 82f2f2f2f,”,+p-price+p-price+p-price+p-price);*橙色表达式等价于橙色表达式等价于橙色表达式等价于橙色表达式等价于+(p-price)*+(p-price)*+(p-price)*+(p-price)*第8章 用户自定义数据类型 指针与结构printf(printf(”8 8.2f2f,”,(+p)(+p)-priceprice);*先计算先计算先计算先计算+p+p+p+p,p p p p指向指向指向指向bookl*bookl*book
18、l*bookl*printf(printf(”8 8.2f2f,”,p+p+-priceprice);*上述表达式等价于上述表达式等价于上述表达式等价于上述表达式等价于(p+)-price*(p+)-price*(p+)-price*(p+)-price*printf(“printf(“8.2f8.2fn”n”,p p-price+price+);*上述表达式等价于上述表达式等价于上述表达式等价于上述表达式等价于(p-price)+*(p-price)+*(p-price)+*(p-price)+*for(pfor(pbookbook;pbook+3pname,(*p).author,p-pu
19、bday.year p-name,(*p).author,p-pubday.year,p-pubday.monthp-pubday.month,p-price)p-price);运行结果:运行结果:运行结果:运行结果:54 540000,35 350000,35 350000,28 280000 C+-Buider C+-Buider网络开发实例舴者网络开发实例舴者网络开发实例舴者网络开发实例舴者:清汉计算机工作室清汉计算机工作室清汉计算机工作室清汉计算机工作室,出版日期出版日期出版日期出版日期:20002000年年年年9 9月月月月,价格:价格:价格:价格:54540 0 SQLServer
20、 SQLServer循序渐进教程,作者:循序渐进教程,作者:循序渐进教程,作者:循序渐进教程,作者:PetkovicPetkovic,出版日期:,出版日期:,出版日期:,出版日期:19991999年年年年6 6月,价格:月,价格:月,价格:月,价格:35350 0 VB VB开发指南,作者:开发指南,作者:开发指南,作者:开发指南,作者:DianneSieboldDianneSiebold,出版日期:,出版日期:,出版日期:,出版日期:20002000年年年年9 9月,价格:月,价格:月,价格:月,价格:29290 0 运行程序运行程序运行程序运行程序第8章 结构体作为函数参数 例例例例8 8
21、1515#includestdio#includeh struct st struct st int a int a;char b char b;fun(struct st bc)fun(struct st bc)bc bca+a+5 5;bc bcb bAA;printf(printf(”被调函数中成员的值是:被调函数中成员的值是:被调函数中成员的值是:被调函数中成员的值是:d d,c c n n”,bcbc.a a,bcbc.b)b);main()main()struct st bl struct st bl;b1 b1a=3a=3;b1 b1b bcc;fun(b1)fun(b1);pr
22、intf(printf(”主调函数中成员主调函数中成员主调函数中成员主调函数中成员 的值是:的值是:的值是:的值是:d d,c c n n”,”,”,”,b1 b1.a a,b1b1.b)b);运行结果:运行结果:运行结果:运行结果:被调函数中成员的值是:被调函数中成员的值是:被调函数中成员的值是:被调函数中成员的值是:8 8,A A 主调函数中成员的值是:主调函数中成员的值是:主调函数中成员的值是:主调函数中成员的值是:3 3,c c 例例例例8 81616#includestdio#includehstruct ststruct st int a int a;char b char b;m
23、ain()main()struct st b1 struct st b1;b1 b1.a a3 3;b1 b1.b=cb=c;fun(&b1)fun(&b1);printf(printf(”d d,c c n n”,”,”,”,b1b1.a a,b1b1.b)b);fun(struct st*bp)fun(struct st*bp)bp bp-a+a+5 5;bp bp-bbAA;printf(printf(”d d,c c n n”,”,”,”,bpbp-aa,bpbp-b)b);运行结果:运行结果:运行结果:运行结果:8 8,A A 8 8,A A 例例例例8 81717#define N
24、 3#define N 3 struct ststruct st int num int num;char name7 char name7;float score float score;main()main()int i;int i;float avg,inpu_avg(struct st*)float avg,inpu_avg(struct st*);struct st studentN struct st studentN;avg avginpu_avg(student)inpu_avg(student);*结构数组名作为函数的实参结构数组名作为函数的实参结构数组名作为函数的实参结构数
25、组名作为函数的实参*printf(printf(”学号学号学号学号 姓名姓名姓名姓名 成绩成绩成绩成绩n n”);for(i for(i0 0;iNiN;i+)i+)printf(printf(“4d4d7s7s6 6.1f1fn n”,studentistudenti.numnum,studentistudenti.namename,studentistudenti.score)score);printf(printf(”平均成绩:平均成绩:平均成绩:平均成绩:4 41f1fn n”,avg)avg);float inpu_avg(struct st*p)float inpu_avg(str
26、uct st*p)int i int i;float temp float temp,avgavg0 00 0;for(i=0;iN for(i=0;inumnum,(p+i)(p+i)-namename,&temp)&temp);(p+i)(p+i)-score scoretemptemp;avg+=(p+i)avg+=(p+i)-score score;avg avgavgavgN N;return avg return avg;运行结果:运行结果:运行结果:运行结果:1 1 王王王王 军军军军 78 780 0 2 2 吴晓兰吴晓兰吴晓兰吴晓兰 67 670 0 3 3 张张张张 东东东东 92 925 5 *以上是键盘输入以上是键盘输入以上是键盘输入以上是键盘输入*学号学号学号学号 姓名姓名姓名姓名 成绩成绩成绩成绩 1 1 王王王王 军军军军 78 780 0 2 2 吴晓兰吴晓兰吴晓兰吴晓兰 67 670 0 3 3 张张张张 东东东东 92 925 5 平均成绩:平均成绩:平均成绩:平均成绩:79792 2