第四讲函数和指针精选文档.ppt

上传人:石*** 文档编号:70743771 上传时间:2023-01-27 格式:PPT 页数:39 大小:1.88MB
返回 下载 相关 举报
第四讲函数和指针精选文档.ppt_第1页
第1页 / 共39页
第四讲函数和指针精选文档.ppt_第2页
第2页 / 共39页
点击查看更多>>
资源描述

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

1、第四讲函数和指针本讲稿第一页,共三十九页函数考点考点考核几率考核几率分值分值函数的定义与返回值函数的定义与返回值80%13库函数库函数60%12函数调用及形参与实参之间函数调用及形参与实参之间的数据传递(难点)的数据传递(难点)100%24函数的声明函数的声明60%01本讲稿第二页,共三十九页一、函数的定义一、函数的定义1、函数定义函数定义功能单一且独立的程序模块,用于完成特定的任功能单一且独立的程序模块,用于完成特定的任务并根据需要返回一个确定的值。务并根据需要返回一个确定的值。2 2、函数定义的格式、函数定义的格式 返回值类型返回值类型函数名函数名(类型类型1 1形参名形参名1,1,类型类

2、型2 2 形参名形参名2 2,)说明部分说明部分 语句部分语句部分 首部首部+函数体函数体本讲稿第三页,共三十九页3 3、注意事项、注意事项(1 1)函数返回值类型名缺省时,返回值类型)函数返回值类型名缺省时,返回值类型默认为默认为intint,无返回值时类型是,无返回值时类型是voidvoid。(2 2)函数名和形参名是用户标识符。主函数的)函数名和形参名是用户标识符。主函数的函数名必须为函数名必须为mainmain。(3 3)函数名后面的括号)函数名后面的括号“()()”不能省。形参不能省。形参用于数据传递,可以缺省。用于数据传递,可以缺省。(4 4)一对花括号中的内容为函数体,包含两)一

3、对花括号中的内容为函数体,包含两部分:说明部分和语句部分。部分:说明部分和语句部分。(5 5)函数不能嵌套定义。)函数不能嵌套定义。本讲稿第四页,共三十九页二、函数返回值二、函数返回值return语句格式为:语句格式为:return(表达式表达式);注意:注意:(1)表达式可以不加括号。)表达式可以不加括号。(2)表达式的值就是函数的返回值,类型)表达式的值就是函数的返回值,类型应和函数定义返回值的类型一致,否则系应和函数定义返回值的类型一致,否则系统强制转换。统强制转换。(3)如果有多个)如果有多个return语句,则只有第一个语句,则只有第一个起作用,因为一旦遇到起作用,因为一旦遇到ret

4、urn语句就会结束语句就会结束当前函数的运行。当前函数的运行。本讲稿第五页,共三十九页double area(double a,double b)double s;s=a*b;return s;本讲稿第六页,共三十九页int max(int a,int b)int c;if(ab)c=a;else c=b;return c;本讲稿第七页,共三十九页例1int isprime(int a)int i;for(i=2;i=a/2;i+)if(a%i=0);本讲稿第八页,共三十九页三、库函数三、库函数C语言自己提供的函数称为库函数。语言自己提供的函数称为库函数。在使用某一类库函数的时候,需要在程序的

5、开头在使用某一类库函数的时候,需要在程序的开头使用使用include命令包含头文件。命令包含头文件。如,使用如,使用printf和和scanf函数时,开头要加上函数时,开头要加上#include 使用数学函数类里的函数时开头要加上使用数学函数类里的函数时开头要加上#include“math.h”“”可以换成可以换成 附录五附录五 P190 本讲稿第九页,共三十九页四、函数调用四、函数调用1、函数调用的形式、函数调用的形式 函数名函数名(实参实参);说明:说明:(1)不写返回值类型和实参类型。)不写返回值类型和实参类型。(2)实参可以是常量、变量、表达式、函数调)实参可以是常量、变量、表达式、函

6、数调用。用。(3)参数传递方向:实参)参数传递方向:实参形参(单向)。形参(单向)。(4)若函数返回值类型是)若函数返回值类型是void,则函数调用不能,则函数调用不能出现在表达式中,不能赋值给变量。出现在表达式中,不能赋值给变量。(5)函数可以直接或间接的调用自己,称为递)函数可以直接或间接的调用自己,称为递归调用。归调用。本讲稿第十页,共三十九页函数数据的传递函数数据的传递注意:注意:(1)数据只能从实参单向传到形参,无论形)数据只能从实参单向传到形参,无论形参值如何改变,都不会影响到对应实参的值;参值如何改变,都不会影响到对应实参的值;(2)函数最多只能返回一个函数值。)函数最多只能返回

7、一个函数值。形参在函数被调用时临时分配存储空间,一形参在函数被调用时临时分配存储空间,一旦函数使用完毕,这些空间马上被释放。旦函数使用完毕,这些空间马上被释放。本讲稿第十一页,共三十九页void swap(int x,int y)int t;t=x;x=y;y=t;printf(%d%d,x,y);main()int a=3,b=4;swap(a,b);printf(%d%d,a,b);本讲稿第十二页,共三十九页2008年4月(12)以下程序的输出结果是:#include void fun(int x)if(x/20)fun(x/2);printf(“%d”,x);main()fun(3);p

8、rintf(“n”);本讲稿第十三页,共三十九页五、函数的声明1、函数声明的形式、函数声明的形式返回值类型返回值类型 函数名函数名(类型类型1 形参形参1,类型类型2形形参参2,);即在函数的首部加上分号。即在函数的首部加上分号。2、函数声明的注意事项、函数声明的注意事项(1)可省略形参名,不可省略形参的类型。)可省略形参名,不可省略形参的类型。如,如,double area(double ,double);本讲稿第十四页,共三十九页(2)声明时的参数名可与定义时的形参名相同,)声明时的参数名可与定义时的形参名相同,也可不同。也可不同。如如,double area(double x,doubl

9、e y);(3)声明的位置:在函数的内部,该函数属于)声明的位置:在函数的内部,该函数属于私有函数;如果在所有函数的外部,则属于私有函数;如果在所有函数的外部,则属于公有函数。公有函数。3、函数的两种使用方式、函数的两种使用方式(1)先定义,后调用。)先定义,后调用。(2)先声明,后调用,最后定义。)先声明,后调用,最后定义。本讲稿第十五页,共三十九页void swap(int x,int y)int t;t=x;x=y;y=t;printf(%d%d,x,y);main()int a=3,b=4;swap(a,b);printf(%d%d,a,b);main()int a=3,b=4;voi

10、d swap(int,int);swap(a,b);printf(%d%d,a,b);void swap(int x,int y)int t;t=x;x=y;y=t;printf(%d%d,x,y);本讲稿第十六页,共三十九页2008年4月(34)有以下程序#include int f(int x)int y;if(x=0|x=1)return(3);y=x*x-f(x-2);return y;main()int z;z=f(3);printf(“%dn”,z);程序的运行结果是:A)0 B)9 C)6 D)8 本讲稿第十七页,共三十九页2007年9月试题分析(25)若函数调用时的实参为变量时

11、,以下关于函数形参和实参的叙述中正确的是A)函数的实参和其对应的形参共占同一存储单元B)形参只是形式上的存在,不占用具体存储单元C)同名的实参和形参占同一存储单元D)函数的形参和实参分别占用不同的存储单元本讲稿第十八页,共三十九页(8)以下程序的运行结果是。int k=0;void fun(int m)m+=k;k+=m;printf(“m=%dn k=%d”,m,k+);main()int i=4;fun(i+);printf(“i=%d k=%dn”,i,k);本讲稿第十九页,共三十九页指针考点考点考核几率考核几率分值分值变量的地址和指针(难点)变量的地址和指针(难点)60%24指针变量的

12、定义、赋值和运指针变量的定义、赋值和运算等操作(难点)算等操作(难点)100%48函数之间地址值的传递(难函数之间地址值的传递(难点)点)70%25本讲稿第二十页,共三十九页一、指针变量的定义1.引言引言(1)变量的存储过程:)变量的存储过程:在程序中定义一个变量;编译时,系统根在程序中定义一个变量;编译时,系统根据变量的类型,为变量分配一定的存储空间;据变量的类型,为变量分配一定的存储空间;内存中每个字节都有唯一的一个编号,这个内存中每个字节都有唯一的一个编号,这个编号就叫做这个字节的地址;相当于旅馆的编号就叫做这个字节的地址;相当于旅馆的房间号;房间号;每个变量在内存中的第一个字节的编号就

13、是每个变量在内存中的第一个字节的编号就是该变量的地址;该变量的地址;该空间中存放着变量的值,相当于是旅客;该空间中存放着变量的值,相当于是旅客;本讲稿第二十一页,共三十九页eg:int a=5;则其内存结构图为:;则其内存结构图为:变量变量a的地址为的地址为2001,对应于,对应于“总统套房的总统套房的”房间号是房间号是“401”;变量变量a的值为的值为5,对应于,对应于“总统套房总统套房”里的里的“值值”是旅客;是旅客;变量变量a的存储空间数为的存储空间数为4个字节,对应于个字节,对应于“总统总统套房套房”有四个单间;有四个单间;a a2001200120022002200320032004

14、20045总统套房总统套房401401402402403403404404旅旅客客本讲稿第二十二页,共三十九页(2)对内存单元的访问:)对内存单元的访问:1)直接访问:)直接访问:已知变量已知变量a的地址,根据此地址直接对变量的地址,根据此地址直接对变量a的存的存储空间进行操作;储空间进行操作;2)间接访问:)间接访问:事先不知道事先不知道a的地址,知道的地址,知道a的地址放在存储的地址放在存储单元单元b中,而且已知存储单元中,而且已知存储单元b的地址:的地址:访问存储单元访问存储单元b,得到存储单元,得到存储单元a的地址;的地址;由得到的地址,访问存储单元由得到的地址,访问存储单元a,对,对

15、a的值进的值进行操作;行操作;52001a直接访问直接访问52001a20012008b间接访问间接访问本讲稿第二十三页,共三十九页一个例子:我们要打开抽屉我们要打开抽屉A有两种方法:有两种方法:.拿出拿出A抽屉的钥匙,直接打开抽屉抽屉的钥匙,直接打开抽屉A,拿出所,拿出所需东西;需东西;.拿出抽屉拿出抽屉B的钥匙,打开抽屉的钥匙,打开抽屉B,取出抽屉,取出抽屉A的钥匙;用抽屉的钥匙;用抽屉A的钥匙,打开抽屉的钥匙,打开抽屉A,取出,取出所需东西;所需东西;keyAA直接访问直接访问keyAAKey AkeyBB间接访问间接访问本讲稿第二十四页,共三十九页2.指针变量的定义指针:用来存放地址的

16、变量称为指针变量。指针:用来存放地址的变量称为指针变量。指针就是地址。指针就是地址。因此,一个指针变量的值就是某个变量的地址因此,一个指针变量的值就是某个变量的地址或称为某变量的指针。或称为某变量的指针。格式:类型名格式:类型名 *变量名;变量名;说明:说明:*表示这是一个指针变量,变量名即为定义的指针表示这是一个指针变量,变量名即为定义的指针变量名,类型名表示本指针变量只能用于存储该变量名,类型名表示本指针变量只能用于存储该数据类型的变量。数据类型的变量。eg:int *p,*q;char*ch;本讲稿第二十五页,共三十九页二级指针变量:类型名二级指针变量:类型名*指针变量名指针变量名;eg

17、:int *p,*q;3.指针变量的赋值指针变量的赋值通过通过“&”运算符给指针变量赋初值,运算符给指针变量赋初值,“&”用于求变量的地址;用于求变量的地址;int a=3,*p;p=&a;/*将变量将变量a的地址赋给的地址赋给p,也说,也说p指向变量指向变量a*/注:单目运算符注:单目运算符“&”只能和变量结合,不能放只能和变量结合,不能放在表达式或常量的前面。在表达式或常量的前面。3a2001P2001本讲稿第二十六页,共三十九页通过其他指针变量获得地址值通过其他指针变量获得地址值 int*p,*q,a;p=&a;q=p;/*指针变量指针变量p和和q都指向了都指向了a*/给指针变量赋空值给

18、指针变量赋空值 表示该指针变量不指向任何变量。表示该指针变量不指向任何变量。p=NULL;使用使用NULL时,应在程序前面先预定义:时,应在程序前面先预定义:#include注:不能通过空指针访问一个存储单元。注:不能通过空指针访问一个存储单元。本讲稿第二十七页,共三十九页(真题)以下叙述中错误的是A)改变函数形参的值,不会改变对应实参的值B)函数可以返回地址值C)可以给指针变量赋一个整数作为地址值 D)当在程序的开头包含头文件stdio.h时,可以给指针变量赋NULL本讲稿第二十八页,共三十九页4.引用存储单元引用存储单元间接访问运算符:间接访问运算符:*含义:含义:*p表示访问表示访问p所

19、指向变量的值。所指向变量的值。int a=3,*p;p=&a;*p=a;注意:注意:第一行中的第一行中的*p和第三行中的和第三行中的*p的区别的区别*(&a)=*p=*&a.*与与&优先级相同,自右向左优先级相同,自右向左等价关系等价关系:a,*p,*(&a)相等价;相等价;&a,p,&(*p)相等价;相等价;本讲稿第二十九页,共三十九页例例1main()int a=7,b=8,*p,*q,*r;p=&a;q=&b;r=p;p=q;q=r;printf(“%d,%d,%dn”,*p,*q,a,b);本讲稿第三十页,共三十九页5.指针的移动指针的移动移动指针就是通过赋值运算,使指针变量加上或移动

20、指针就是通过赋值运算,使指针变量加上或减去一个整数,使指针变量指向相邻的存储单元。减去一个整数,使指针变量指向相邻的存储单元。eg:int *p;p=p+1;p P+110001001100210031004100510061007本讲稿第三十一页,共三十九页5.指针的比较指针的比较pq:p所指单元在所指单元在q之后;之后;pq:p所指单元在所指单元在q之前。之前。p q a0a1a2a3a4本讲稿第三十二页,共三十九页二、函数之间地址值的传递1、传值调用与传址调用、传值调用与传址调用(1)传值:前面学习的普通变量作实参的函数)传值:前面学习的普通变量作实参的函数调用便是传值调用。形参改变时实

21、参不变。调用便是传值调用。形参改变时实参不变。(2)传址:当函数的形参为指针变量时,则调用)传址:当函数的形参为指针变量时,则调用该函数时,对应的实参也必须是与形参基类型相该函数时,对应的实参也必须是与形参基类型相同的地址值或指针变量,这种函数调用即传址调同的地址值或指针变量,这种函数调用即传址调用。形参变化时,实参也会改变。用。形参变化时,实参也会改变。本讲稿第三十三页,共三十九页 void swap(int x,int y)int t;t=x;x=y;y=t;printf(%d%d,x,y);main()int a=3,b=4;swap(a,b);printf(%d%d,a,b);本讲稿第

22、三十四页,共三十九页void swap(int*a,int*b)int t;t=*a;*a=*b;*b=t;main()int a=3,b=4;printf(1)a=%db=%dn,a,b);swap(&a,&b);printf(2)a=%db=%dn,a,b);本讲稿第三十五页,共三十九页一个易错的题:#include void fun(int*a,int*b)int*c;c=a;a=b;b=c;main()int x=3,y=5,*p=&x,*q=&y;fun(p,q);printf(%d,%d,*p,*q);fun(&x,&y);printf(%d,%dn,*p,*q);程序的结果是:3,5,3,5本讲稿第三十六页,共三十九页2、函数返回地址值、函数返回地址值函数返回值的类型也可以为指针类型。函数返回值的类型也可以为指针类型。例例3 输入输入a为为10,b为为20本讲稿第三十七页,共三十九页int*fun(int*,in*);main()int a,b,*p;scanf(“%d%d”,&a,&b);p=fun(&a,&b);printf(“a=%d,b=%d,*p=%dn”,a,b,*p);int*fun(int*x,in*y)if(*x*y)return x;return y;本讲稿第三十八页,共三十九页本讲稿第三十九页,共三十九页

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

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

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

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