函数第指针讲稿.ppt

上传人:石*** 文档编号:47029920 上传时间:2022-09-28 格式:PPT 页数:111 大小:4.79MB
返回 下载 相关 举报
函数第指针讲稿.ppt_第1页
第1页 / 共111页
函数第指针讲稿.ppt_第2页
第2页 / 共111页
点击查看更多>>
资源描述

《函数第指针讲稿.ppt》由会员分享,可在线阅读,更多相关《函数第指针讲稿.ppt(111页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、函数第指针函数第指针第一页,讲稿共一百一十一页哦本学期内容本学期内容n函数与指针(模块化程序设计)函数与指针(模块化程序设计)n结构体(自定义数据类型)结构体(自定义数据类型)面向对象面向对象类类n文件(数据的持久化)文件(数据的持久化)n其他知识点:预处理、位运算其他知识点:预处理、位运算n综合项目综合项目“学生成绩管理系统学生成绩管理系统”第二页,讲稿共一百一十一页哦第7章 第8章函数 指针第三页,讲稿共一百一十一页哦本章知识要点本章知识要点n怎样定义函数?如何调用函数?如何声明函数?怎样定义函数?如何调用函数?如何声明函数?n什么是函数的参数?在函数调用时,参数是如何传递的?什么是函数的

2、参数?在函数调用时,参数是如何传递的?n值传递与地址传递的区别是什么?值传递与地址传递的区别是什么?n变量、内存单元和地址之间是什么关系?变量、内存单元和地址之间是什么关系?n什么是直接访问?什么是间接访问?什么是直接访问?什么是间接访问?n什么是指针变量?指针变量的基本运算有哪些?什么是指针变量?指针变量的基本运算有哪些?怎样才能使用怎样才能使用指针变量?指针变量?n指针作为函数参数的作用是什么?指针作为函数参数的作用是什么?n如何使用指针实现函数调用返回多个值?如何使用指针实现函数调用返回多个值?n如何利用指针实现对数组的访问?如何利用指针实现对数组的访问?第四页,讲稿共一百一十一页哦本章

3、技能要求本章技能要求n能够使用函数进行模块化程序设计能够使用函数进行模块化程序设计函数的定义、调用。函数的定义、调用。n能够使用指针,在函数调用时进行间接访问能够使用指针,在函数调用时进行间接访问使用指针访问单个变量使用指针访问单个变量使用指针访问数组使用指针访问数组第五页,讲稿共一百一十一页哦任务程序(设计子函数)任务程序(设计子函数)n1.计算圆柱体积(有返回值,有参数计算圆柱体积(有返回值,有参数的函数)的函数)n2.求组合数求组合数(函数的嵌套调用)(函数的嵌套调用)n3.五个人求年龄问题(函数的递归)五个人求年龄问题(函数的递归)n4.寻找保险箱密码寻找保险箱密码(指针的概念)(指针

4、的概念)n5.狸猫换太子狸猫换太子(指针做函数参数)(指针做函数参数)n6.对成绩的进行排序(数组名(指针)做函数对成绩的进行排序(数组名(指针)做函数参数)参数)n综合项目(综合项目(一一):用函数实现学生成绩的输入、):用函数实现学生成绩的输入、排序、插入、输出结果等功能。排序、插入、输出结果等功能。值传递值传递地址地址传递传递第六页,讲稿共一百一十一页哦7.1计算圆柱体积计算圆柱体积7.1.1程序解析程序解析7.1.2函数的定义函数的定义7.1.3函数的调用函数的调用第七页,讲稿共一百一十一页哦7.1.1程序解析计算圆柱体积程序解析计算圆柱体积例例7-1输入圆柱体的高和半径,求圆柱体积,

5、输入圆柱体的高和半径,求圆柱体积,volume=*r2*h。要求定义和调用函数要求定义和调用函数cylinder(r,h)计算圆计算圆柱体的体积。柱体的体积。第八页,讲稿共一百一十一页哦例例7-1源程序源程序/*计算圆柱体积计算圆柱体积*/#includevoidmain()doubleheight,radius,volume;doublecylinder(doubler,doubleh);/*函数声明函数声明*/printf(Enterradiusandheight:);scanf(%lf%lf,&radius,&height);/*调用函数调用函数,返回值赋给,返回值赋给volume*/v

6、olume=cylinder(radius,height);printf(Volume=%.3fn,volume);第九页,讲稿共一百一十一页哦例例7-1源程序源程序/*定义求圆柱体积的函数定义求圆柱体积的函数*/doublecylinder(doubler,doubleh)doubleresult;result=3.1415926*r*r*h;/*计算体积计算体积*/returnresult;/*返回结果返回结果*/Enterradiusandheight:3.010Volume=282.743第十页,讲稿共一百一十一页哦7.1.2函数的定义函数的定义n函数是指完成一个特定工作的独立程序模块

7、。函数是指完成一个特定工作的独立程序模块。库函数:由库函数:由C语言系统提供定义语言系统提供定义如如scanf()、()、printf()等函数()等函数自定义函数:需要用户自己定义自定义函数:需要用户自己定义如计算圆柱体体积函数如计算圆柱体体积函数cylinder()()nmain()也也是是一一个个函函数数,C程程序序由由一一个个main()或或多多个个函函数数构构成。成。n程程序序中中一一旦旦调调用用了了某某个个函函数数,该该函函数数就就会会完完成成一一些些特特定定的的工作,然后返回到调用它的地方。工作,然后返回到调用它的地方。函函数数经经过过运运算算,得得到到一一个个明明确确的的运运算

8、算结结果果,并并需需要要回回送送该该结结果果。例例如,函数如,函数cylinder()返回圆柱的体积。返回圆柱的体积。函数完成一系列操作步骤,不需要回送任何运算结果。函数完成一系列操作步骤,不需要回送任何运算结果。第十一页,讲稿共一百一十一页哦1返回运算结果返回运算结果的函数定义的函数定义函数类型函数类型函数名(形参表)函数名(形参表)/*函数首部函数首部*/*函数体函数体*/函数实现过程函数实现过程return表达式;表达式;把函数运算的结果回送给主函数把函数运算的结果回送给主函数只能返回一个值只能返回一个值函数返回值的类型函数返回值的类型没有分号doublecylinder(doubler

9、,doubleh)doubleresult;result=3.1415926*r*r*h;returnresult;第十二页,讲稿共一百一十一页哦形参形参类型类型1参数参数1,类型,类型2参数参数2,类型,类型n参数参数n参数之间用逗号分隔,每个参数前面的类型都必须分别写明参数之间用逗号分隔,每个参数前面的类型都必须分别写明函数类型函数类型函数名(形参表)函数名(形参表)函数实现过程函数实现过程return表达式;表达式;不能写成不能写成doubler,hdoublecylinder(doubler,doubleh)doubleresult;result=3.1415926*r*r*h;ret

10、urnresult;第十三页,讲稿共一百一十一页哦doublecylinder(doubler,doubleh)/*函数首部函数首部*/*函数体函数体,写在一对大括号内,写在一对大括号内*/doubleresult;result=3.1415926*r*r*h;/*计算圆柱体积计算圆柱体积*/returnresult;/*返回运算结果返回运算结果*/分析函数的定义分析函数的定义函数类型函数类型函数名函数名形参表形参表与函数类型一致与函数类型一致第十四页,讲稿共一百一十一页哦2不返回运算结不返回运算结果的函数定义果的函数定义void函数名(参数表)函数名(参数表)/*函数首部函数首部*/*函数体

11、函数体*/函数实现过程函数实现过程return;/*可以省略可以省略return*/这类函数通常用于屏幕输出等这类函数通常用于屏幕输出等表示不返回结果表示不返回结果不能省略不能省略否则否则函数类型被默认定义为函数类型被默认定义为int第十五页,讲稿共一百一十一页哦例例7-2输出输出5之内的数字金字塔。之内的数字金字塔。/*输出数字金字塔输出数字金字塔*/#includeintmain(void)voidpyramid(intn);/*函数声明函数声明*/pyramid(5);/*调用函数,输出数字金字塔调用函数,输出数字金字塔*/return0;voidpyramid(intn)/*函数定义函

12、数定义*/inti,j;for(i=1;i=n;i+)/*需要输出的行数需要输出的行数*/for(j=1;j=n-i;j+)/*输出每行左边的空格输出每行左边的空格*/printf();for(j=1;j=i;j+)/*输出每行的数字输出每行的数字*/printf(%d,i);/*每个数字的前后各有一个空格每个数字的前后各有一个空格*/putchar(n);122333444455555 第十六页,讲稿共一百一十一页哦7.1.3函数的调用函数的调用n定义一个函数后,就可以在程序中调用这个定义一个函数后,就可以在程序中调用这个函数。函数。n调用标准库函数时,在程序的最前面用调用标准库函数时,在程

13、序的最前面用#include命令包含相应的头文件。命令包含相应的头文件。n调用自定义函数时,程序中必须有与调用函调用自定义函数时,程序中必须有与调用函数相对应的函数定义。数相对应的函数定义。第十七页,讲稿共一百一十一页哦1函数调用的形式和过程函数调用的形式和过程n使用返回值:使用返回值:volume=cylinder(radius,height);printf(“%fn”,cylinder(radius,height);n完成操作:完成操作:pyramid(5);常用于常用于voidvoid类型函数的调用类型函数的调用常用于返回结果的函数的调用常用于返回结果的函数的调用常量、变量、表达式常量、

14、变量、表达式函数名函数名(实参表实参表)第十八页,讲稿共一百一十一页哦函数调用的过程函数调用的过程n计计算算机机在在执执行行程程序序时时,从从主主函函数数main开开始始执执行行,如如果果遇遇到到某某个个函函数数调调用用,主主函函数数被被暂暂停停执执行行,转转而而执执行行相相应应的的函函数数,该该函函数数执执行行完完后后,将将返返回回主主函函数数,然然后后再再从从原原先先暂停的位置继续执行。暂停的位置继续执行。n函数遇函数遇return或最后的大括号,返回主函数或最后的大括号,返回主函数第十九页,讲稿共一百一十一页哦分析函数调用的过程分析函数调用的过程#includeintmain(void)

15、doubleheight,radius,volume;doublecylinder(doubler,doubleh);printf(Enterradiusandheight:);scanf(%lf%lf,&radius,&height);volume=cylinder(radius,height);printf(Volume=%.3fn,volume);return0;doublecylinder(doubler,doubleh)doubleresult;result=3.1415926*r*r*h;returnresult;调用调用函数函数实参实参形参形参执行函数中的语句执行函数中的语句返回

16、调用它的地方返回调用它的地方第二十页,讲稿共一百一十一页哦2参数传递参数传递n函数函数定义定义时的参数被称为时的参数被称为形式参数形式参数(简称(简称形参形参)doublecylinder(doubler,doubleh);n函数函数调用调用时的参数被称为时的参数被称为实际参数实际参数(简称(简称实参实参)volume=cylinder(radius,height);n实参实参形参形参在参数传递过程中,实参把值复制给形参,与位置有关,与名字无关。在参数传递过程中,实参把值复制给形参,与位置有关,与名字无关。形参和实参形参和实参一一对应一一对应:数量一致,类型一致,顺序一致:数量一致,类型一致,

17、顺序一致形参形参:变量,用于接受实参传递过来的值:变量,用于接受实参传递过来的值实参实参:常量、变量或表达式:常量、变量或表达式n存储单元存储单元在内存中,实参单元与形参单元是不同的单元。在内存中,实参单元与形参单元是不同的单元。在调用函数时,给形参分配存储单元,并将实参对应的值传递给形参在调用函数时,给形参分配存储单元,并将实参对应的值传递给形参调用结束后,形参单元被释放,实参单元仍保留并维持原值。调用结束后,形参单元被释放,实参单元仍保留并维持原值。单向传递,只由实参传给形参,而单向传递,只由实参传给形参,而不能由形参传回来给实参不能由形参传回来给实参第二十一页,讲稿共一百一十一页哦3函数

18、结果返回函数结果返回n函数返回的两种情况函数返回的两种情况完完成成确确定定的的运运算算,有有一一个个运运算算结结果果返返回回给给主主调调函数。函数。完完成成指指定定工工作作,没没有有确确定定的的运运算算结结果果需需返返回回给给主调函数(函数类型主调函数(函数类型void)。)。n函数结果返回的形式:函数结果返回的形式:return表达式;表达式;return(表达式表达式);第二十二页,讲稿共一百一十一页哦【例【例7-3】定义判断奇偶数的函数】定义判断奇偶数的函数even(n)定义一个判断奇偶数的函数定义一个判断奇偶数的函数even(n),当,当n为偶数时返回为偶数时返回1,否则返回,否则返回

19、0。/*判断奇偶数的函数判断奇偶数的函数*/inteven(intn)/*函数首部函数首部*/if(n%2=0)/*判别奇偶数判别奇偶数*/return1;/*偶数返回偶数返回1*/elsereturn0;/*奇数返回奇数返回0*/如何调用该如何调用该函数?函数?第二十三页,讲稿共一百一十一页哦4函数原型声明函数原型声明函数类型函数类型 函数名函数名(参数表参数表);doublecylinder(doubler,doubleh);voidpyramid(intn);n函数必须先定义后调用,将主调函数放在被调函数的后函数必须先定义后调用,将主调函数放在被调函数的后面,就像变量先定义后使用一样。面

20、,就像变量先定义后使用一样。n如果自定义函数在主调函数的后面,就需要在函数调用如果自定义函数在主调函数的后面,就需要在函数调用前,加上函数原型声明。前,加上函数原型声明。n函数声明:说明函数的类型和参数的情况,以保证函数声明:说明函数的类型和参数的情况,以保证程序编译时能判断对该函数的调用是否正确。程序编译时能判断对该函数的调用是否正确。只写函数定义中的第只写函数定义中的第1 1行(函数首部),并以分号结束。行(函数首部),并以分号结束。第二十四页,讲稿共一百一十一页哦#includeintmain(void)doubleheight,radius,volume;doublecylinder(

21、doubler,doubleh);printf(Enterradiusandheight:);scanf(%lf%lf,&radius,&height);volume=cylinder(radius,height);printf(Volume=%.3fn,volume);return0;doublecylinder(doubler,doubleh)doubleresult;result=3.1415926*r*r*h;returnresult;第二十五页,讲稿共一百一十一页哦练习练习n1.在屏幕上打印五行在屏幕上打印五行*号,每行分别为号,每行分别为5个,个,30个,个,10个个,28个,个,

22、16个个n2.比较两个整数,输出大者。调用两次函数,比较两个整数,输出大者。调用两次函数,求求3个数的大者。改写函数求三个数的大者个数的大者。改写函数求三个数的大者第二十六页,讲稿共一百一十一页哦写出下列函数的函数首部写出下列函数的函数首部n求求n!n求求xyn求(求(1+2+n)n求(求(m+n)n求最大公约数,最小公倍数求最大公约数,最小公倍数第二十七页,讲稿共一百一十一页哦7.2求组合数求组合数8.2.1分析分析8.2.2函数的定义函数的定义8.2.3函数的嵌套调用函数的嵌套调用1.输入输入m,n2.求求3个阶乘个阶乘3.计算计算4.输出结果输出结果第二十八页,讲稿共一百一十一页哦求求N

23、!#includevoidmain()longfac(intn);intn;longy;printf(“n=);scanf(%d,&n);y=fac(n);printf(“%d!=%15ldn,n,y);long fac(int n)long f=1;int i;for (i=1;i=n;i+)f=f*i;return f;第二十九页,讲稿共一百一十一页哦求求N!#includevoidmain()longfac(intn);longCmn(intm,intn);intn,m;longy;printf(“m=);scanf(%d,&m);printf(“n=);scanf(%d,&n);y=C

24、mn(m,n);printf(“Cmn=%15ldn,y);long fac(int n)long f=1;int i;for (i=1;i1)第三十四页,讲稿共一百一十一页哦用一个函数来描述上述递归过程:用一个函数来描述上述递归过程:int age(int)*求年龄的递归函数求年龄的递归函数*int;if(n=1)c=10;else c=age(n-1)+2;return(c););用一个主函数调用用一个主函数调用age函数,求得第函数,求得第5人的年龄。人的年龄。#include void main()printf(“%d”,age(5);运行结果如下:运行结果如下:第三十五页,讲稿共一百

25、一十一页哦例例7.8 用递归方法求!用递归方法求!=!。!(,)(,)!()!()!()()#inchudelongfac(intn)longf;if(n=0|n=1)f=1;elsef=fac(n-1)*n;returnf;第三十六页,讲稿共一百一十一页哦例例7.9 hanoi7.9 hanoi(汉诺)塔问题。这是一个古典的数学问题,是一个用递归(汉诺)塔问题。这是一个古典的数学问题,是一个用递归方法解题的典型例子。方法解题的典型例子。问题是这样的:古代有一个梵塔,塔内有问题是这样的:古代有一个梵塔,塔内有3 3个座个座A A、B B、C C,开始时,开始时座上有个盘子,盘子大小不等,大的在

26、下,小的在上。有座上有个盘子,盘子大小不等,大的在下,小的在上。有一个老和尚想把这个盘子从座移到座,但每次只允许移一个老和尚想把这个盘子从座移到座,但每次只允许移动一个盘,且在移动过程中在动一个盘,且在移动过程中在3 3个座上都始终保持大盘在下,小个座上都始终保持大盘在下,小盘在上。在移动过程中可以利用座,要求编程序打印出移动的盘在上。在移动过程中可以利用座,要求编程序打印出移动的步骤。步骤。第三十七页,讲稿共一百一十一页哦A ABBCCA ABBCC第三十八页,讲稿共一百一十一页哦由上面的分析可知:将个盘子从座移到座可以分由上面的分析可知:将个盘子从座移到座可以分解为以下解为以下3个步骤:个

27、步骤:(1)将上将上n-1 个盘借助座先移到座上。个盘借助座先移到座上。(2)把座上剩下的一个盘移到座上。把座上剩下的一个盘移到座上。(3)将将n-1个盘从座借助于座移到座上。个盘从座借助于座移到座上。A ABBCCn-1n-1第三十九页,讲稿共一百一十一页哦程序如下:程序如下:#include void main()void hanoi(int n,char one,char two,char three);/*对对hanoi函数的声明函数的声明*/int m;printf(input the number of diskes:);scanf(“%d”,&m);printf(The step

28、 to moving%d diskes:n,m);hanoi(m,A,B,C);第四十页,讲稿共一百一十一页哦void hanoi(int n,char one,char two,char three)/*定义定义hanoi函数函数,将个盘从将个盘从one座借助座借助two座,移到座,移到three座座*/void move(char x,char y);/*对对move函数的声明函数的声明*/if(n=1)move(one,three);else hanoi(n-1,one,three,two);move(one,three);hanoi(n-1,two,one,three);void mo

29、ve(char x,char y)/*定义定义move函数函数*/printf(“%c-%cn,x,y);第四十一页,讲稿共一百一十一页哦运行情况如下:运行情况如下:input the number of diskes:3 The steps to noving 3 diskes:第四十二页,讲稿共一百一十一页哦练习:练习:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第一半,还不过瘾,又多吃了一个。第2天早上将剩下的桃子天早上将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天吃掉一半,又多吃了一个。以后

30、每天早上都吃了前一天剩下的一半零一个。到第剩下的一半零一个。到第10天早上想再吃时,见只剩下一天早上想再吃时,见只剩下一个桃子。求第个桃子。求第1天共摘了多少桃子?天共摘了多少桃子?a1=(a2+1)*2;a2=(a3+1)*2;a3=(a4+1)*2;.a9=(a10+1)*2;a10=1;第四十三页,讲稿共一百一十一页哦#include int num(int n)int c;if(n=1)c=1;else c=2*(num(n-1)+1);return c;void main()printf(num=%dn,num(10);猴子吃桃问题程序猴子吃桃问题程序第四十四页,讲稿共一百一十一页哦

31、1.局部变量和全局变量局部变量和全局变量n局部变量局部变量在函数内定义的变量(包括形参)在函数内定义的变量(包括形参)作用范围:作用范围:本函数内部本函数内部n全局变量全局变量在函数以外定义的变量,不从属于任一函数。在函数以外定义的变量,不从属于任一函数。作用范围:作用范围:从定义处到源文件结束从定义处到源文件结束(包括各函数)(包括各函数)第四十五页,讲稿共一百一十一页哦n存储类型:存储类型:动态存储:局部变量动态存储:局部变量静态存储:全局变量、静态存储:全局变量、静态局部变量静态局部变量n用户存储空间用户存储空间存储区存储区数据区静态存储区动态存储区堆区栈区代码区int n;void m

32、ain()int x=10,y;y=fun(x);.int fun(int x)int re;re=x=y=x=10栈区第四十六页,讲稿共一百一十一页哦8.4密码存放示意图密码存放示意图龙井号龙井号9111976虎跑号虎跑号19760217名字名字虎跑号虎跑号龙井号龙井号地址地址02171976内容内容1976911第四十七页,讲稿共一百一十一页哦例例8-4-1利用指针模拟寻找保险利用指针模拟寻找保险箱密码的过程箱密码的过程获取密码的两种方法获取密码的两种方法voidmain()intkey=911;/*变量变量key存放密码存放密码*/int*addr=NULL;/*变量变量addr存放地址

33、存放地址*/addr=&key;/*将将key的地址赋给的地址赋给addr*/*通过变量通过变量key输出密码值输出密码值*/printf(Thekeyis:%dn,key);/*通过变量通过变量key的地址来输出密码值的地址来输出密码值*/printf(If I know the address of the key,I also can get it:%dn,*addr);Thekeyis:911IfIknowtheaddressofthekey,Ialsocangetit:911第四十八页,讲稿共一百一十一页哦8.4.2地址和指针地址和指针指针指针的概念的概念 内存单元内存单元地址地址

34、内容内容 变量变量intx=20,y=1,z=155;printf(%d,x;)直接访问直接访问:通过变量名访问:通过变量名访问间接访问间接访问:通过另一个变量访问通过另一个变量访问把变量的地址放到另一变量中把变量的地址放到另一变量中使用时先找到后者使用时先找到后者再再从中取出前者的地址从中取出前者的地址100020 x10041y1008155z20001000p2004地址地址 指针变量指针变量第四十九页,讲稿共一百一十一页哦指针指针 内存单元内存单元地址地址 内容内容 变量变量intx=20,y=1,z=155;printf(%d,x;)100020 x10021y1004155z200

35、01000p2002地址地址 指针变量指针变量指针变量指针变量:存放地址的变量:存放地址的变量某个某个变量变量的地址的地址指向指向第五十页,讲稿共一百一十一页哦指针变量所指向的变量的类型指针变量所指向的变量的类型int*p;p是整型指针,指向整型变量是整型指针,指向整型变量float*fp;fp是浮点型指针,指向浮点型变量是浮点型指针,指向浮点型变量char*cp;cp是字符型指针,指向字符型变量是字符型指针,指向字符型变量类型名类型名*指针变量名指针变量名指针声明符指针声明符8.4.3指针变量的定义指针变量的定义第五十一页,讲稿共一百一十一页哦指针变量的定义指针变量的定义类型名类型名*指针变

36、量名指针变量名int*p;指针变量名是指针变量名是p,不是不是*p*是指针声明符是指针声明符intk,*p1,*p2;等价于:等价于:intk;int*p1;int*p2;第五十二页,讲稿共一百一十一页哦8.8.4指针的基本运算指针的基本运算*间接访问运算符间接访问运算符,访问指针所指向的变量,访问指针所指向的变量*p:指针变量:指针变量p所所指向的指向的变量变量a3&ap*p如果指针的值是某个变量的地址,通过指针就如果指针的值是某个变量的地址,通过指针就能能间接访问间接访问那个变量。那个变量。1、取地址运算和间接访问运算、取地址运算和间接访问运算&取地址运算符取地址运算符,给出变量的地址,给

37、出变量的地址int*p,a=3;p=&a;把把a的地址赋给的地址赋给p,即,即p指向指向a指针变量的类型和它所指向变量的类型相同指针变量的类型和它所指向变量的类型相同第五十三页,讲稿共一百一十一页哦#includeintmain(void)inta=3,*p;p=&a;printf(“a=%d,*p=%dn”,a,*p);*p=10;printf(a=%d,*p=%dn,a,*p);printf(Entera:);scanf(%d,&a);printf(a=%d,*p=%dn,a,*p);(*p)+;printf(a=%d,*p=%dn,a,*p);return0;例例8-4-2指针取地址运算

38、和间接访问运算指针取地址运算和间接访问运算a3&ap*pa=3,*p=3a=10,*p=10Entera:5a=5,*p=5a=6,*p=6第五十四页,讲稿共一百一十一页哦a3&ap*p(1)当当p=&a后,后,*p与与a相同相同(2)int*p;定义定义指针变量指针变量p*p=10;指针指针p所指所指向向的变量的变量,即,即a(3)&*p与与&a相同,相同,是是地址地址*&a与与a相同,相同,是是变量变量(4)(*p)+等价于等价于a+将将p所指所指向向的变量值加的变量值加1*p+等价于等价于*(p+)先取先取*p,然后,然后p自加,自加,此时此时p不再指向不再指向a说明说明inta=1,x

39、,*p;p=&a;x=*p+;第五十五页,讲稿共一百一十一页哦b2&bp2*p2a1&ap1*p121#includeintmain(void)inta=1,b=2,t;int*p1,*p2;p1=&a;p2=&b;printf(a=%d,b=%d,*p1=%d,*p2=%dn,a,b,*p1,*p2);t=*p1;*p1=*p2;*p2=t;printf(a=%d,b=%d,*p1=%d,*p2=%dn,a,b,*p1,*p2);return0;例例8-4-3通过通过指针指针改变变量的值改变变量的值a=1,b=2,*p1=1,*p2=2a=2,b=1,*p1=2,*p2=1第五十六页,讲稿共

40、一百一十一页哦2、赋值运算、赋值运算a3&ap1&ap2*p1*p2inta=3,*p1,*p2;p1=&a;把把a的地址赋给的地址赋给p1,即,即p1指向指向ap2=p1;p2也指向也指向a相同类型的指针才能相互赋值相同类型的指针才能相互赋值第五十七页,讲稿共一百一十一页哦b4&bp2*p2a2&ap1*p16c&a&c例例8-4-4指针指针赋值赋值intmain(void)inta,b,c,*p1,*p2;a=2;b=4;c=6;p1=&a;p2=&b;printf(a=%d,b=%d,c=%d,*p1=%d,*p2=%dn,a,b,c,*p1,*p2);p2=p1;p1=&c;print

41、f(a=%d,b=%d,c=%d,*p1=%d,*p2=%dn,a,b,c,*p1,*p2);return0;*p2*p1a=2;b=4;c=6;*p1=2,*p2=4a=2;b=4;c=6;*p1=6,*p2=2第五十八页,讲稿共一百一十一页哦#includevoid main()int i,j,*pi,*pj;pi=&i;pj=&j;i=5;j=7;printf(“%d%d%d%dn,&i,&j,pi,pj);printf(%d%d%d%dn,i,j,*pi,*pj);第六十页,讲稿共一百一十一页哦8.5狸猫换太子狸猫换太子一个关于发生在北宋年间变量替换的故事一个关于发生在北宋年间变量替换

42、的故事关键点分析关键点分析n真宗和李玉未出生的孩子:小王子真宗和李玉未出生的孩子:小王子n刘娥的阴谋:用狸猫替换掉孩子刘娥的阴谋:用狸猫替换掉孩子n筹备工作:设计两套替换行动方案筹备工作:设计两套替换行动方案n实施结果:行动一失败,行动二成功实施结果:行动一失败,行动二成功第六十一页,讲稿共一百一十一页哦intmain(void)intbaby=PRINCE;/*baby代表孩子代表孩子,刚出生时是王子刚出生时是王子*/printf(beforechange,babyis);display(baby);replace1(baby);/*实施狸猫换太子第一次行动实施狸猫换太子第一次行动*/pri

43、ntf(n);printf(afterfirstaction,babyis);display(baby);replace2(&baby);/*实施狸猫换太子第二次行动实施狸猫换太子第二次行动*/printf(n);printf(aftersecondaction,babyis);display(baby);return0;例例8-5-1指针作为函数参数模拟狸猫换太子指针作为函数参数模拟狸猫换太子#defineCIVET0定义狸猫值为定义狸猫值为0#definePRINCE1定义王子值为定义王子值为1voidreplace1(intbaby)baby=CIVET;voidreplace2(int

44、*baby)*baby=CIVET;voiddisplay(intwho)if(who=CIVET)printf(狸猫狸猫);elseif(who=PRINCE)printf(王子王子);beforechange,babyis王子王子afterfirstaction,babyis王子王子aftersecondaction,babyis狸猫狸猫第六十二页,讲稿共一百一十一页哦8.5.2指针指针作为函数的参数作为函数的参数函数参数包括实参和形参,两者的类型要一致函数参数包括实参和形参,两者的类型要一致,可以是指针类型。可以是指针类型。如果如果实参实参是某个变量的是某个变量的地址地址,相应的,相应的

45、形参形参就是就是指针指针。intmain(void)inta=1,b=2;int*pa=&a,*pb=&b;voidswap1(intx,inty),swap2(int*px,int*py),swap3(int*px,int*py);swap1(a,b);printf(“Aftercallingswap1:a=%db=%dn”,a,b);a=1;b=2;swap2(pa,pb);printf(“Aftercallingswap2:a=%db=%dn”,a,b);a=1;b=2;swap3(pa,pb);printf(“Aftercallingswap3:a=%db=%dn”,a,b);retu

46、rn0;调调用用哪哪个个函函数数,可可以以交交换换main()中中变量变量a和和b的值的值?第六十三页,讲稿共一百一十一页哦例例8-5-3swap1()a12bx12y21swap1(a,b);voidswap1(intx,inty)intt;t=x;x=y;y=t;第六十四页,讲稿共一百一十一页哦例例8-5-4swap2()swap2(&a,&b);voidswap2(int*px,int*py)intt;t=*px;*px=*py;*py=t;abpxpy1221第六十五页,讲稿共一百一十一页哦例例8-5-5swap3()swap3(&a,&b);voidswap3(int*px,int*

47、py)int*pt;pt=px;px=py;py=pt;abpxpy12第六十六页,讲稿共一百一十一页哦指针指针作为函数参数的应用作为函数参数的应用swap2(&a,&b);voidswap2(int*px,int*py)intt;t=*px;*px=*py;*py=t;要通过函数调用来改变主调函数中某个变量的值:要通过函数调用来改变主调函数中某个变量的值:(1)在主调函数中,在主调函数中,将该变量的地址或者指向该变量的指将该变量的地址或者指向该变量的指针作为实参针作为实参(2)在被调函数中,在被调函数中,用指针类型形参接受该变量的地址用指针类型形参接受该变量的地址(3)在被调函数中,改变形参

48、所指向变量的值在被调函数中,改变形参所指向变量的值abpxpy1221Aftercallingswap1:a=1,b=2Aftercallingswap2:a=2,b=1Aftercallingswap3:a=1,b=2第六十七页,讲稿共一百一十一页哦8.6对成绩进行排序对成绩进行排序要求:要求:n定义一个数组,输入定义一个数组,输入n个成绩;个成绩;n进行排序;进行排序;n输出该数组的输出该数组的n个成绩;个成绩;第六十八页,讲稿共一百一十一页哦1.程序解析程序解析#includevoidmain()inta10,n;printf(“n=”);scanf(“%d”,&n);inarray(a

49、,n);outarray(a,n);voidinarray(int*arr,intn)inti;for(i=0;in;i+)scanf(“%d”,&arri);voidoutarray(int*arr,intn)inti;for(i=0;in;i+)printf(“%d”,arri);第六十九页,讲稿共一百一十一页哦2.使用指针访问数组使用指针访问数组n使用指针可以访问单个变量使用指针可以访问单个变量intx,*p;p=&x;*p=10;scanf(“%d”,p);printf(“%d”,*p);n使用指针也可以访问数组使用指针也可以访问数组inta10,*p;p=&a0;或或p=a;等价等价

50、for(i=0;i10;i+)scanf(“%d”,(p+i);for(i=0;i10;i+)printf(“%d”,*(p+i);for(i=0;i10;i+)scanf(“%d”,&pi);for(i=0;i10;i+)printf(“%d”,pi);第七十页,讲稿共一百一十一页哦#includevoid main()int i,a10,*p;p=a;for(i=0;i10;i+)printf(a%d的地址:%dn,i,&ai);for(i=0;i10;i+)printf(“p+%d的值:%dn,i,p+i);第七十一页,讲稿共一百一十一页哦3.数组和地址间的关系数组和地址间的关系inta

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 大学资料

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

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁