ImageVerifierCode 换一换
格式:PPT , 页数:91 ,大小:1.43MB ,
资源ID:8013435      下载积分:5 金币
验证码下载
登录下载
邮箱/手机:
验证码: 获取验证码
温馨提示:
支付成功后,系统会自动生成账号(用户名为邮箱或者手机号,密码是验证码),方便下次登录下载和查询订单;
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

开通VIP
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.zixin.com.cn/docdown/8013435.html】到电脑端继续下载(重复下载【60天内】不扣币)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  
声明  |  会员权益     获赠5币     写作写作

1、填表:    下载求助     留言反馈    退款申请
2、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
3、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
4、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
5、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【二***】。
6、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
7、本文档遇到问题,请及时私信或留言给本站上传会员【二***】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。

注意事项

本文(c语言函数精ppt课件.ppt)为本站上传会员【二***】主动上传,咨信网仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知咨信网(发送邮件至1219186828@qq.com、拔打电话4008-655-100或【 微信客服】、【 QQ客服】),核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载【60天内】不扣币。 服务填表

c语言函数精ppt课件.ppt

1、单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,模块化程序设计,基本思想:将一个大的程序按功能分割成一些小模块,特点:,各模块相对独立、功能单一、结构清晰、接口简单,控制了程序设计的复杂性,提高元件的可靠性,缩短开发周期,避免程序开发的重复劳动,易于维护和功能扩充,第六章 函数,C是模块化程序设计语言,C程序结构,C,是,函数式,语言,必须有且只能有一个名为,main,的主函数,C,程序的执行总是,从,main,函数开始,在,main,中结束,函数,不能嵌套定义,可以,嵌套,调用,例、,在 C 程序中,函数既可以嵌套定义,也可以嵌套调用。,函数分类,从用户角

2、度,标准函数(库函数):由系统提供,用户自定义函数,从函数形式,无参函数,有参函数,使用,库函数,应注意:,1、函数功能,2、函数参数的数目和顺序,及各参数意义和类型,3、函数返回值意义和类型,4、需要使用的包含文件,Ch7_201.c,6.1,函数,一、函数的定义,一般格式,合法标识符,函数返回值类型,缺省,int,型,无返回值,void,函数体,函数类型 函数名,(,形参类型说明表,),说明部分,语句部分,例 有参函数(现代风格),int max,(int x,int y,),int z;,z=xy?x:y;,return(z);,例 有参函数(现代风格),int max(,int x,y

3、,),int z;,z=xy?x:y;,return(z);,例,空函数,dummy(),函数体为空,例 无参函数,printstar(),printf(“*n”);,或,printstar(,void,),printf(“*n”);,返回语句,形式:,return(,表达式);,或,return 表达式;,或,return;,功能:使程序控制从被调用函数返回到调用函数中,同时把返值带给调用函数,说明:,函数中可有多个return语句,若无return语句,遇,时,自动返回调用函数,若函数类型与return语句中表达式值的类型不一致,按前者为准,自动转换-,函数调用转换,void,型函数,例

4、无返回值函数,void,swap(int x,int y),int temp;,temp=x;,x=y;,y=temp;,例、编写程序,输入一个正整数n,求下列算式的值。要求定义和调用函数fact(k)计算k的阶乘,函数返回值的类型是double。2006年春试题。,double fact(int k),double s=0;,int i,t=1;,for(i=1;ib)c=1;,else if(a=b)c=0;,else c=-1;,return(c);,例 参数求值顺序,运行结果:0,调用函数,语句1;,主调函数,主调函数,Return语句或最后一个,执行函数调用的内涵:,1、把实参的值传

5、给形参;,2、把控制语句传给被调函数;也就是说程序的执行由主调函转到被调函数;,3、在函数中执行return语句,将返回值带回到主调函数。,printstar(),printf(*);,main(),int a;,a=printstar();,printf(%d,a);,例 函数带回不确定值,输出:10,void,printstar(),printf(*);,main(),int a;,a=printstar();,printf(%d,a);,编译错误!,例 函数返回值类型转换,main(),float a,b;,int c;,scanf(%f,%f,c=max(a,b);,printf(Ma

6、x is%dn,c);,max,(float x,float y),float z;,z=xy?x:y;,return(z);,三、函数参数及其传递方式,形参与实参,形式参数:定义函数时函数名后面括号中的变量名,实际参数:调用函数时函数名后面括号中的表达式,c=max(a,b);,(main 函数),(max 函数),max(int x,int y),int z;,z=xy?x:y;,return(z);,例 比较两个数并输出大者,main(),int a,b,c;,scanf(%d,%d,c=,max(a,b);,printf(Max is%d,c);,max(,int x,int y,),

7、int z;,z=xy?x:y;,return(z);,形参,实参,说明1:,实参必须有确定的值,形参必须指定类型,形参与实参,类型一致,个数相同,若形参与实参类型不一致,自动按形参类型转换,函数调用转换,形参在函数被调用前不占内存;,函数调用时为形参分配内存;调用结束,内存释放,形参与实参,形式参数:定义函数时函数名后面括号中的变量名,实际参数:调用函数时函数名后面括号中的表达式,说明2:,1.形参只有在函数调用时才分配存储单元,调用结束后,,释放所分配的单元,;,2.实参可以是常量、变量、表达式,总之,要有确定的值,,当函数调用时,将实参的值传递给形参,若是数组名,则传送的是数组的首地址。

8、,3.被调函数中,形参类型必须指定,以便分配存储单元。,4,.,实参、形参的数据类型一致,,赋值要兼容,顺序要一致。,5.若被调函数类型为非整形,要在主调函数中对被调函数作原形声明或在主调函数之前定义。,6.,实参对形参的数据传送是值传送,也是单向传送,,当被调函数的形参发生变化时,并不改变主调函数实参的值。,例 计算x,的立方,#include,float cube(,float x,),return(x*x*x);,main(),float a,product;,printf(Please input value of a:);,scanf(%f,product=,cube(a);,pri

9、ntf(”Cube of%.4f is%.4fn,a,product);,x,a,product,1.2,1.2,1.728,1、参数传递方式,值传递,方式,方式:函数调用时,为形参分配单元,并将实参的值,复制,到形参中;调用结束,形参单元被释放,实参单元仍保留并维持原值,特点:,形参与实参占用,不同,的内存单元,单向,传递,7,11,x:,y:,调用前:,调用结束:,7,11,x:,y:,例 交换两个数,/*ch7_2.c*/,#include,main(),int x=7,y=11;,printf(x=%d,ty=%dn,x,y);,printf(swapped:n);,swap(x,y)

10、;,printf(x=%d,ty=%dn,x,y);,swap(,int a,int b,),int temp;,temp=a;a=b;b=temp;,调用:,7,11,a:,b:,7,11,x:,y:,swap:,7,11,x:,y:,11,7,a:,b:,temp,函数说明,对被调用函数要求:,必须是,已存在,的函数,库函数:,#include,用户自定义函数:,函数类型说明,函数说明,一般形式:,函数类型 函数名(形参类型 形参名,.);,或,函数类型 函数名();,作用:告诉编译系统,函数类型、参数个数及类型,以便检验,函数定义,与,函数说明,不同,函数说明位置:,程序的数据说明部分(

11、函数内或外),下列情况下,可不作函数说明,若函数返值是char,或int型,,系统自动按int型处理,被调用函数定义出现在主调函数之前,有些系统(如Borland C+)要求函数说明指出函数返值类型和形参类型,并且对void 和 int 型函数也要进行函数说明,例 函数说明举例,main(),float a,b;,int c;,scanf(%f,%f,c=max(a,b);,printf(Max is%dn,c);,max(float x,float y),float z;,z=xy?x:y;,return(z);,int型函数可不作函数说明,(Borland C+,不行),/*ch7_5.c

12、*/,float add(float x,float y),float z;,z=x+y;,return(z);,main(),float a,b,c;,scanf(%f,%f,c=add(a,b);,printf(sum is%f,c);,被调函数出现在主调函数,之前,不必函数说明,/*ch7_5.c*/,main(),float add(float,float);,/*function declaration*/,float a,b,c;,scanf(%f,%f,c=add(a,b);,printf(sum is%f,c);,float add(float x,float y),float

13、 z;,z=x+y;,return(z);,float add();,二、地址传递,方式:函数调用时,将数据的,存储地址,作为参数传递给形参,特点:,形参与实参占用,同样,的存储单元,“双向”,传递,实参和形参必须是,地址,常量或变量,方法有两种,指针作函数的参数,数组作函数的参数,1、,指针作函数的参数,(,1)、用指针(地址)作函数参数,可以实现“通过被调用的函数改变主调函数中变量的值”的目的。,(2)、使用指针作为函数参数可以在调用一个函数时得到多 个由被调函数改变了的值。,/*ch9_3.c*/,swap(int*p1,int*p2),int p;,p=*p1;,*p1=*p2;,*p

14、2=p;,main(),int a,b;,scanf(%d,%d,printf(“a=%d,b=%dn”,a,b);,printf(“swapped:n”);,swap(,printf(”a=%d,b=%dn,a,b);,例 交换两个数,a,5,9,b,调前:,a,5,9,b,调swap:,p1,&a,&b,p2,a,9,5,b,交换:,p1,&a,&b,p2,a,9,5,b,返回:,例如:有一数组有10个元素,要求输出其中最大和最小的元素值。,#define N 10,main(),void max_min(int arr,int*pt1,int*pt2,int n);,int arrayN

15、=1,8,10,2,-5,0,7,15,4,-5,*p1,*p2,a,b;,p1=,max_min(array,p1,p2,N);,printf(“max=%d,min=%d”,a,b);,void max_min(int arr,int*pt1,int*pt2,int n),int I;,*pt1=*pt2=arr0;,for(I-=1;I*pt1)*pt1=arrI;,if(arrIy?x:y;,return(rz?r:z);,int min(int x,int y,int z),int r;,r=xy?x:y;,return(rz?r:z);,main(),调用函数dif,输出,结束,d

16、if,函数,max,函数,调用函数max,调用函数min,min,函数,例 用弦截法求方程根,x,y,f(x),0,x,1,x,2,x,f(x,1),f(x,2),求f(x1),与f(x2)连线与x轴的交点x,输入x1,x2,求f(x1),f(x2),直到f(x1),与f(x2)异号,y=f(x),y1=f(x1),y,与y1同号,真,假,x1=x,y1=y,x2=x,直到,|y|,root=x,输出,root,root,函数,运行情况:,Input x1,x2:,2,6,A root of equation is 5.0000,main(),调用函数root,输出根 x,结束,root,函数

17、,xpoint,函数,调用函数xpoint,调用函数f,f,函数,递归调用,定义:函数直接或间接的调用自身叫函数的递归调用,f(),调f,调f2,调f1,f1(),f2(),说明,C,编译系统对递归函数的自调用次数没有限制,每调用函数一次,在内存堆栈区分配空间,用于存放函数变量、返回值等信息,所以递归次数过多,可能引起堆栈溢出,int,f(int x),int y,z;,z=f(y);,.,return(2*z);,int,f1(int x),int y,z;,z=f2(y);,.,return(2*z);,int,f2(int t),int a,c;,c=f1(a);,.,return(3+

18、c);,例 求n,的阶乘,/*ch7_8.c*/,#include,int fac(int n),int f;,if(n0)printf(n%c#”,a,b);,else,f(n-1,a,c,b);,printf(“%c-%c#”,a,b);,f(n-1,c,b,a);,A1#13#32#B32#12#13#,C,1,3#,3,2#,1,2#D,1,3#1,2#3,2#,6.2,函数参数,一、数组元素作函数实参,值传递,例 两个数组大小比较,4,3,2,1,0,5,a,56,23,12,10,76,88,4,3,2,1,0,5,b,21,23,43,98,66,54,n=0,m=0,k=0,i

19、,n=0,m=0,k=1,i,n=0,m=1,k=1,i,n=1,m=1,k=1,i,n=1,m=1,k=2,i,n=2,m=1,k=2,i,n=3,m=1,k=2,a和b为有10个元素的整型数组,比较两数组对应元素,变量n,m,k记录aibi,ai=bi,aik,认为数组ab,若nk,认为数组ab,若n=k,认为数组a=b,#include,main(),int a10,b10,i,n=0,m=0,k=0;,printf(Enter array a:n);,for(i=0;i10;i+),scanf(%d,printf(Enter array b:n);,for(i=0;i10;i+),sc

20、anf(%d,for(i=0;iy)flag=1;,else if(xy)flag=-1;,else flag=0;,return(flag);,数组名作函数参数,地址传递,在主调函数与被调函数分别定义数组,且类型应一致,形参数组大小(多维数组第一维)可不指定,形参数组名是,地址变量,例 求学生的平均成绩,#include,float average(int stu10,int n);,void main(),int score10,i;,float av;,printf(Input 10 scores:n);,for(i=0;i10;i+),scanf(%d,av=,average(,sco

21、re,10);,printf(Average is:%.2f,av);,float average(,int,stu10,int n),int i;,float av,total=0;,for(i=0;in;i+),total+=stui;,av=total/n;,return av;,实参用数组名,形参用数组定义,int stu,.,.,2,1,0,9,score,56,23,12,.,.,88,stu,例 数组元素与 数组名,作函数参数比较,1,2,a,调用前,a0,a1,1,2,a,调用,a0,a1,1,2,x,y,2,1,x,y,交换,1,2,a,返回,#include,void,sw

22、ap2(int x,int y),int z;,z=x;x=y;y=z;,main(),int a2=1,2;,swap2(a0,a1);,printf(a0=%dna1=%dn,a0,a1);,值传递,1,2,a,调用前,1,2,a,x,调用,2,1,a,x,交换,2,1,a,返回,#include,void,swap2,(int x,),int z;,z=x0;x0=x1;x1=z;,main(),int a2=1,2;,swap2(,a,);,printf(a0=%dna1=%dn,a0,a1);,地址传递,例 数组元素与 数组名,作函数参数比较,例 数组排序-简单选择排序,void,s

23、ort(,int array,int n),int i,j,k,t;,for(i=0;in-1;i+),k=i;,for(j=i+1;jn;j+),if(arrayjarrayk)k=j;,if(k!=i),t=arrayi;,arrayi=arrayk;,arrayk=t;,main(),int a10,i;,for(i=0;i10;i+),scanf(%d,sort(a,10);,for(i=0;i10;i+),printf(%d,ai);,printf(n);,0,1,2,3,4,5,6,7,8,9,a,49,68,57,32,9,99,27,13,76,88,array,k,j,j,j

24、,k,j,k,j,j,j,j,j,9,49,i=0,例 数组排序-简单选择排序,void,sort(,int array,int n),int i,j,k,t;,for(i=0;in-1;i+),k=i;,for(j=i+1;jn;j+),if(arrayjarrayk)k=j;,if(k!=i),t=arrayi;,arrayi=arrayk;,arrayk=t;,main(),int a10,i;,for(i=0;i10;i+),scanf(%d,sort(a,10);,for(i=0;i10;i+),printf(%d,ai);,printf(n);,k,j,j,k,j,k,j,j,j,

25、j,j,0,1,2,3,4,5,6,7,8,9,a,49,68,57,32,9,99,27,13,76,88,array,9,49,k,k,13,68,i=1,0,1,2,3,4,5,6,7,8,9,a,9,13,27,32,49,57,68,76,88,99,array,i=8,例 数组排序-简单选择排序,void,sort(,int array,int n),int i,j,k,t;,for(i=0;in-1;i+),k=i;,for(j=i+1;jn;j+),if(arrayjarrayk)k=j;,if(k!=i),t=arrayi;,arrayi=arrayk;,arrayk=t;,

26、main(),int a10,i;,for(i=0;i10;i+),scanf(%d,sort(a,10);,for(i=0;i10;i+),printf(%d,ai);,printf(n);,例 求二维数组中最大元素值,1 3 5 7,2 4 6 8,15 17 34 12,i,j,max=1,1 3 5 7,2 4 6 8,15 17 34 12,i,j,max=3,1 3 5 7,2 4 6 8,15 17 34 12,i,j,max=5,j,1 3 5 7,2 4 6 8,15 17 34 12,i,max=7,j,1 3 5 7,2 4 6 8,15 17 34 12,i,max=7

27、,j,1 3 5 7,2 4 6 8,15 17 34 12,i,max=34,int max_value,(int array34,),int i,j,k,max;,max=array00;,for(i=0;i3;i+),for(j=0;jmax),max=arrayij;,return(max);,main(),int a34=1,3,5,7,2,4,6,8,15,17,34,12;,printf(max value is%dn,max_value(,a,),);,多维形参数组第一维维数,可省略,第二维必须相同,int array4,例 求二维数组中各行元素之和,get_sum_row(,

28、int x3,int result,int row,int col),int i,j;,for(i=0;irow;i+),resulti=0;,for(j=0;jcol;j+),resulti+=xij;,main(),int a23=3,6,9,1,4,7;,int sum_row2,row=2,col=3,i;,get_sum_row(,a,sum_row,row,col);,for(i=0;irow;i+),printf(The sum of row%d=%dn,i+1,sum_rowi);,3,1,4,6,7,9,a,sum_row,x,result,18,12,几点说明:,1.数组名

29、作形、实参数时,应分别在主、被调函数中对其声明,2.,形、实参数的数组类型要一致,大小一般相等,,以保证数据的全部传送;,3.,当形参数组大小未指定时,用一实参将数组长度传递给形参以便对数组进行操作,;,4.数组名作参数时,传递的是地址,对形参数组的操作实际上也是对实参数组的操作。,6.2.2 字符串指针作函数参数,将一个字符串从一个函数传递到另一个函数,可以采用地址传递的办法,即将字符数组名作参数或用指向字符串的指针变量作参数。在被调用的函数中可以改变字符串的内容,在主调函数中可以得到改变了的字符串。,void,copy_string(from,to),char from,to;,int i

30、=0;,while(fromi!=0),toi=fromi;,i+;,toi=0;,main(),char a=I am a teacher.;,char b=you are a student.;,printf(string_a=%snstring_b=%sn,a,b);,copy_string(a,b);,printf(nstring_a=%snstring_b=%sn,a,b);,1)形参和实参都用用字符数组作参数,程序。,void copy_string(from,to),char,*from,*to,;,for(;*from!=0;from+,to+),*to=*from;,*to=

31、0;,main(),char a=I am a teacher.;,char b=you are a student.;,printf(string_a=%snstring_b=%sn,a,b);,copy_string(,a,b,);,printf(nstring_a=%snstring_b=%sn,a,b);,2)形参用字符指针变量,实参用数组名。,另外形参和实参都用字符指针,以及形参用字符数组名,实参用字符指针在,10,.3.2中已经讲过,不再重复,。,3)copy_string函数的简化,6.3 函数指针,一个函数包括一组指令序列,存储在某一段内存中,这段内存空间的起始地址称为,函数的

32、入口地址,称函数入口地址为,函数的指针。函数名,代表函数的入口地址,可以定义一个指针变量,其值等于该函数的入口地址,指向这个函数,这样通过这个指针变量也能调用这个函数。这种指针变量称为,指向函数的指针变量。,定义指向函数的指针变量的一般形式为,:,类型标识符(*指针变量名,)(),;,例:,int,(*p)();/*,指针变量,p,可以指向一个整型函数*,/,float (*q)();/*,指针变量,q,可以指向一个浮点型函数*,/,下一页,上一页,刚定义的指向函数的指针变量,亦象其它指针变量一样要赋以地址值才能引用。当将某个函数的入口地址赋给指向函数的指针变量,就可用该指针变量来调用所指向的

33、函数,给函数指针赋初值:将函数名(函数的入口地址值)赋给指针变量,例如,int,m,(*p)();,int,max(int,a,int,b);,则可以,p=max;/*p,指向函数,max()*/,指针调用函数的,一般形式为,:,(,*,指针变量,)(,实参表,),;,如上例,:,m=(*p)(12,22);/*,比较,m=max(12,22);*/,下一页,上一页,用函数指针调用函数是间接调用,没有参数类型说明,,,C,编译系统也无法进行类型检查,因此,在使用这种形式调用函数时要特别小心。实参一定要和指针所指函数的形参类型一致。,函数指针可以作为函数参数,此时,当函数指针每次指向不同的函数时

34、,可执行不同的函数来完成不同的功能,下一页,上一页,注意,例,函数max()用来求一维数组的元素的最大值,在主调函数中用函数名调用该函数与用函数指针调用该函数来实现。,下一页,上一页,#include stdio.h,#define M 8,main(),float sumf,sump;,float aM=11,2,-3,4.5,5,69,7,80;,float(*p)();/*定义指向函数的指针p*/,float max(float a,int n);/*函数声明*/,p=max;/*函数名(函数入口地址)赋给指针p*/,sump=(*p)(a,M);/*用指针方式调用函数*/,sumf=m

35、ax(a,M);/*用函数名调用max()函数*/,printf(sump=%.2fn,sump);,printf(sumf=%.2fn,sumf);,float max(float a,int n),int k;,float s;,s=a0;,for(k=0;kn;k+),if(sak)s=ak;,return s;,下一页,上一页,程序运行结果:,sump=80.00,sumf=80.00,(1)定义一个指向函数的指针变量,形如:,float(*p)();,(2)为函数指针赋值,格式如下:,p=函数名;,注意:赋值时只需给出函数名,不要带参数。,(3)通过函数指针调用函数,调用格式如下:,

36、s=(*p)(实参);,上一页,指向函数的指针的使用步骤,返回,函数指针的作用:,用函数指针变量作函数的参数,函数的参数既可以是变量,常量,指针变量,数组名,数组指针变量,也,可以是函数指针或函数指针变量;以便实现函数地址的传送,达到用某,个函数调用其他的函数.,函数的调用方式:,1.直接使用,函数名,2.间接调用,通过,函数指针,0,Y,X,h,f(b)=,f(a+n*h),b,a,f(a),共n等份,f(x),h=(b-a)/n,f(a+h),f(a+(n-1)*h),s,=,/*1+,x,2,*/,float f1(x),float x;,float f;,f=1+x*x;return(

37、f);,float f3(x),float x;,float f;f=x/(1+x*x);,return(f);,/*1+,x+x,2,+x,3,*/,float f2(x),float x;,float f;,f=1+x+x*x+x*x*x;,return(f);,多层间接调用_即用,函数指针变量作函数的参数,在调用一个通,用函数时,便于处理多种情况,以便选用各种专用,的函数.这样做的好处是使得程序通用性强,结构,模块化程度高,.例 求不同被积函数的积分,x,1+,x,2,x,y1=,0,1,(1+,x,2,)dx,y2=,0,2,(1+,x+x,2,+x,3,)dx,0,3.5,1+,x,

38、2,x,y3=,dx,float integral(,fun,a,b),float,(*fun)(),a,b;,float s,h,y;,int n,i;,s=(,(*fun)(a),+,(*fun)(b),)/,2.0,;,n=100;,h=(b-a)/n;,for(i=1;iy)return (,else return (,下一页,上一页,6.5 命令行参数,在操作系统命令状态下,可以输入程序或命令使其运行,称命令行状态。输入的命令(或运行程序)及该命令(或程序)所需的参数称为命令行参数。,如:,copy fd fs,copy,是文件拷贝命令,,fd、fs,是命令行参数。,main函数是可

39、以有参数的,但与普通函数不同。,带形参的main()函数的一般形式是:,main(int argc,char*argv),形参argc记录命令行中字符串的个数,argv是一个字符型指针数组,每一个元素顺序指向命令行中的一个字符串。,下一页,上一页,1.main()函数的形参与实参,main()函数由系统自动调用,而不是被程序内部的其它函数调用,main()函数所需的实参不可能由程序内部得到,而是由系统传送。,main()函数所需的实参与形参的传递方式也与一般函数的参数传递不同,实参是在命令行与程序名一同输入,程序名和各实际参数之间都用空格分隔。,格式为:执行程序名 参数1 参数2 参数n,形参

40、argc为命令行中参数的个数,(包括执行程序名),其值大于或等于1,而不是象普通C语言函数一样接受第一个实参。,形参argv是一个指针数组,其元素依次指向命令行中以空格分开的各字符串。,即:第一个指针argv0指向程序名字符串,argv1指向参数1,argv2指向参数2,.,argvn 指向参数n。,下一页,上一页,2.命令行参数的传递示例,例,8.11,分析下列程序,指出其执行结果,该程序命名为,exam.c,经编译连接后生成的可执行程序为,exam.exe,#include,main(int argc,char *argv ),int i=0;,printf(“argc=%dn”,argc

41、);,while (argc=1),printf(“n参数%d:%s”,i,*argv);,i+;argc-;argv+;,下一页,上一页,输出结果:,argc=4,参数,0,:,exam,参数,1,:,Turbo_c,参数,2,:,C+,参数,3,:,Vc,程序开始运行后,系统将命令行中字符串个数送argc,将四个字符串实参:exam、Turbo_c、C+、Vc的首地址分别传给字符指针数组元素argv0、argv1、argv2、argv3。,若运行该程序时的命令行输入的是:,exam Turbo_c C+Vc,上一页,返回,6.6,变量的存储属性,概述,变量是对程序中数据的存储空间的抽象,内

42、存,.,main(),int a;,a=10;,printf(“%d”,a);,编译或函数调用时为其分配内存单元,10,2000,2001,程序中使用变量名对内存操作,变量的属性,数据类型:变量所持有的数据的性质(,操作属性,),存储属性,存储器类型:寄存器、静态存储区、动态存储区,生存期,:变量在某一时刻存在-静态变量与动态变量,作用域,:变量在某区域内有效-局部变量与全局变量,变量的存储类型,auto -自动型,register-寄存器型,static -静态型,extern -外部型,变量定义格式:,存储类型 数据类型 变量表;,概述,变量是对程序中数据的存储空间的抽象,如:int su

43、m;,auto,int a,b,c;,register,int i;,static,float x,y;,局部变量与全局变量,局部变量-内部变量,定义:在,函数内定义,,,只在本函数内有效,说明:,main,中定义的变量只在main中有效,不同函数中同名变量,占不同内存单元,形参属于局部变量,可定义在复合语句中有效的变量,局部变量可用存储类型,:auto register static,(,默认为auto),float f1(int a),int b,c;,.,char f2(int x,int y),int i,j;,main(),int m,n;,.,a,b,c,有效,x,y,i,j,有效

44、,m,n,有效,例 不同函数中同名变量,main(),int a,b;,a=3;,b=4;,printf(main:a=%d,b=%dn,a,b);,sub();,printf(main:a=%d,b=%dn,a,b);,sub(),int a,b;,a=6;,b=7;,printf(sub:a=%d,b=%dn,a,b);,例 复合语句中变量,#define N 5,main(),int i;,int aN=1,2,3,4,5;,for(i=0;iN/2;i+),int temp;,temp=ai;,ai=aN-i-1;,aN-i-1=temp;,for(i=0;iN;i+),printf(

45、%d ,ai);,运行结果:5 4 3 2 1,例 复合语句中变量,#define N 5,main(),int i;,int aN=1,2,3,4,5;,for(i=0;iN/2;i+),int temp;,temp=ai;,ai=aN-i-1;,aN-i-1=temp;,for(i=0;i,外部变量说明:,extern,数据类型 变量表;,外部变量定义与外部变量说明不同,若外部变量与局部变量同名,则外部变量被屏蔽,外部变量可用存储类型,:,缺省,或,static,float max,min;,float average(float array,int n),int i;float sum=

46、array0;,max=min=array0;,for(i=1;imax),max,=arrayi;,else if(arrayiy?x:y;,return(z);,main(),extern int a,b;,printf(max=%d,max(a,b);,int a=13,b=-8;,运行结果:max=13,extern int a,b;,int max(),int z;,z=,ab?a:b;,return(z);,main(),printf(max=%d,max();,int a=13,b=-8;,/*ch7_17.c*/,int a=3,b=5;,max(,int a,int b,),

47、int c;,c=ab?a:b;,return(c);,main(),int a=8;,printf(max=%d,max(a,b);,例 外部变量与局部变量,运行结果:max=8,int i;,main(),void prt();,for(i=0;i5;i+),prt();,void prt(),for(i=0;i5;i+),printf(“%c”,*);,printf(“n”);,例 外部变量副作用,运行结果:*,动态变量与静态变量,存储方式,静态存储:程序运行期间分配固定存储空间,动态存储:程序运行期间根据需要动态分配存储空间,内存用户区,程序区,静态存储区,动态存储区,全局变量、局部静

48、态变量,形参变量,局部动态变量(auto register),函数调用现场保护和返回地址等,生存期,静态变量:从程序开始执行到程序结束,动态变量:从包含该变量定义的函数开始执行至函数执行结束,1,、,auto变量,函数内部无static声明的局部量均为动态存储类别,被分配在动态区。存储类别为自动时,声明符auto可省;自动变量被分配在动态区,未赋初值时,其值未定义,每次调用重新赋值。,int f(int a),auto int b,c=3;/*定义b、c为自动变量*/,又如:,auto int b,c=3;,int b,c=3;,/*两者等价*/,2、用static 声明局部变量,若希望函数,

49、调用结束后,其值不消失,,下次调用函数时继续使用,则用static对变量加以声明。,例 考察静态局部变量的值,f(int a),auto int b=0;,static int c=3;,b=b+1;c=c+1;,return(a+b+c);,main(),int a=2,i;,for(i=0;i3;i+)printf(“%d ”,f(a);,运行结果:7 8 9,静态局部变量的声明:,(1)分配在静态区,程序运行结束释放存储单元。,(2)仅开始时赋初值一次(未赋初值时为0),以后每次调用函数时,变量不再赋值,前次 操作的结果被保留。,(3)局部动态变量若未赋初值,其值是不确定的,所分配的存储

50、单元是不固定的;,而局部静态变量未赋初值,其值为0,(字符型变量的值为0),所分配的存储单元是固定的。,(4)静态局部变量在函数调用结束后虽存在,但其它函数不能引用它。,使用局部静态变量有如下几种情况,(1)需要保留上一次调用结束时的值,(2)初始化后变量只被引用而不改变其值,则用静态局部变量较方便,缺点:从程序运行开始到结束一直占用内存,这样会浪费系统资源。,例 打印 15的阶乘值,int fac(int n),static int f=1;,f=f*n;,return(f);,main(),int i;,for(i=1;i=5;i+)printf(“%d!=%dn”,i,fac(i);,问

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服