指针与函数学习.pptx

上传人:莉*** 文档编号:73781698 上传时间:2023-02-22 格式:PPTX 页数:23 大小:156.22KB
返回 下载 相关 举报
指针与函数学习.pptx_第1页
第1页 / 共23页
指针与函数学习.pptx_第2页
第2页 / 共23页
点击查看更多>>
资源描述

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

1、指针与函数指针与函数指向函数的指针 返回指针值的函数 第1页/共23页指向函数的指针指向函数指针变量的定义 用指向函数的指针变量来调用函数 指向函数的指针变量作函数参数 第2页/共23页5.1.1 5.1.1 指向函数指针变量的定义指向函数指针变量的定义指向函数的指针变量(简称函数指针)每一个函数都是一个程序模块,这个模块在内存中都占有一片存储区,每一个函数都是一个程序模块,这个模块在内存中都占有一片存储区,函数名函数名代表了该存储区的代表了该存储区的首地址首地址,称为函数的入口地址,称为函数的入口地址 。定义一个指针变量并且使它。定义一个指针变量并且使它指向函数的入口地址,就称这个指针变量为

2、指向函数的指针变量。指向函数的入口地址,就称这个指针变量为指向函数的指针变量。指向函数的指针变量的定义指向函数的指针变量的定义 (*指针变量名)(形参表);存储类别存储类别 函数指针变量本身的存储特性;函数指针变量本身的存储特性;数据类型数据类型 指针指向的指针指向的函数的返回值类型;函数的返回值类型;给指向函数的指针变量赋值:给指向函数的指针变量赋值:指向函数的指针变量函数名指向函数的指针变量函数名;函数指针的调用格式函数指针的调用格式 (*(*函数指针变量函数指针变量)()(实参表实参表)第3页/共23页指向函数的指针指向函数指针变量的定义 用指向函数的指针变量来调用函数 指向函数的指针变

3、量作函数参数 第4页/共23页定义指向函数的指针变量后,就可将一个函数名赋给该指针变量。此后,对该指针变量的指针运算就是使程序控制转移到指针指向的函数入口地址去执行该函数的函数体。例如:有函数说明为:void swap(int x,int y);指向函数的指针变量定义:void(*fp)(int x,int y);将函数名swap赋给函数指针变量fp:fp=swap;使用函数指针变量fp调用函数swap的形式:(*fp)(a,b)fp(a,b);5.1.2 5.1.2 用指向函数的指针变量调用函数用指向函数的指针变量调用函数第5页/共23页例例例例5-15-15-15-1 编程序计算下面的公式

4、,其中编程序计算下面的公式,其中n n从键盘输从键盘输入,要求使用指向函数的指针变量来实现。入,要求使用指向函数的指针变量来实现。(n(n(n(n为奇数时为奇数时为奇数时为奇数时)(n(n(n(n为偶数时为偶数时为偶数时为偶数时)5.1.2 5.1.2 用指向函数的指针变量调用函数用指向函数的指针变量调用函数第6页/共23页5.1.2 5.1.2 用指向函数的指针变量调用函数用指向函数的指针变量调用函数FFTT图图图图5.1 5.1 5.1 5.1 程序算法描述程序算法描述程序算法描述程序算法描述开始开始n=1n=1n%2=0n%2=0fp=f1fp=f1fp=f2fp=f2(*fp)(n)(

5、*fp)(n)调用函数调用函数结束结束输入输入n n值值输出结果输出结果输出数据错误输出数据错误第7页/共23页根据以上算法描述写出程序代码如下:#include double f1(int x),f2(int x);void main()double(*fp)(int x);/*定义指向函数的指针变量fp*/int n;printf(“input n:”);scanf(“%d”,&n);if(n=1)if(n%2=0)fp=f1;/*n为偶数,指针变量fp指向函数f1()*/else fp=f2;/*n为奇数,指针变量fp指向函数f2()*/printf(“value=%9.4fn”,(*f

6、p)(n);/*用函数指针调用函数*/else printf(“Data error!n”);5.1.2 5.1.2 用指向函数的指针变量调用函数用指向函数的指针变量调用函数66第8页/共23页double f1(int x)int k;double value=1.0;for(k=2;k=x;k=k+2)value=value+(1.0/k)*(1.0/k);return value;double f2(int x)int k;double value=1.0;for(k=3;k=x;k=k+2)value=value+(1.0/k)*(1.0/k);return value;5.1.2 5

7、.1.2 用指向函数的指针变量调用函数用指向函数的指针变量调用函数61+1.0/21+1.0/22 2+1.0/4+1.0/42 2+1.0/6+1.0/62 2第9页/共23页指向函数的指针指向函数指针变量的定义 用指向函数的指针变量来调用函数 指向函数的指针变量作函数参数 第10页/共23页5.1.3 5.1.3 指向函数的指针变量作函数参数指向函数的指针变量作函数参数程序中如何设计通用方法 主要解决两个问题:如何用如何用C C语言描述解决某种问题的通用方法语言描述解决某种问题的通用方法如何将具体问题与解决问题的通用方法联系如何将具体问题与解决问题的通用方法联系 通用方法可应用于求解高阶方

8、程的根、求多元方程组的解、求函数的定积分等。函数指针的作用 主要在程序的函数之间传递函数,即把一个函数的地址作为参数从一个函数传递到另外一个函数。一般主调函数的实参应当是被传递的函数名,而被调函数的形参应该是能接收函数地址的函数指针(指向函数的指针变量)。第11页/共23页5.1.3 5.1.3 指向函数的指针变量作函数参数指向函数的指针变量作函数参数 例5-5 利用已有的通用函数按给定条件求定积分。其中确定精度的等分数从键盘输入。(1)求函数f1(x)=(1+x)在区间0,2的定积分。(2)求函数f2(x)=1/(1+4x2)在区间-1,1的定积分 求定积分的方法:矩形法、梯形法、辛普生法。

9、以梯形法为例,设计求定积分的通用函数步骤:将区间将区间a,ba,b划分为划分为n n等分等分,等分数取决于所,等分数取决于所求精度;求精度;计算出所有等分点的函数值计算出所有等分点的函数值f(xf(xi i);连接相邻两个等分点的函数值,将所求曲边连接相邻两个等分点的函数值,将所求曲边四边形区域用若干个小的梯形代替四边形区域用若干个小的梯形代替;按公式求出所有小的梯形面积,然后求和得按公式求出所有小的梯形面积,然后求和得到曲边四边形面积的近似值;到曲边四边形面积的近似值;第12页/共23页用求梯形面积的方法计算某区间的定积分将a,b区间n等分,则梯形的高h=(b-a)/n求梯形面积的计算公式:

10、S=(f(Xi)+f(Xi+1)*h在X轴除a、b点外,其余点的函数值都加了两次,既是一个梯形的上边,又是另一个梯形的下边;仅有 a、b点的函数值f(a)或f(b)只为某梯形的上边或下边,故程序特殊处理为:a和b点:area=(f(a)+f(b)/2 i取1n-1点:area=area+f(a+i*h)5.1.3 5.1.3 指向函数的指针变量作函数参数指向函数的指针变量作函数参数第13页/共23页5.1.3 5.1.3 指向函数的指针变量作函数参数指向函数的指针变量作函数参数n n 按梯形法求定积分的通用函数按梯形法求定积分的通用函数按梯形法求定积分的通用函数按梯形法求定积分的通用函数col

11、lectcollectcollectcollectdouble collect(double collect(double collect(double collect(double(*p)(float x)double(*p)(float x)double(*p)(float x)double(*p)(float x),float a,float b,int n),float a,float b,int n),float a,float b,int n),float a,float b,int n)int i;int i;int i;int i;float f,h,area;float f,

12、h,area;float f,h,area;float f,h,area;h=(b-a)/n;h=(b-a)/n;h=(b-a)/n;h=(b-a)/n;/*X/*X/*X/*X轴等分区间的长度轴等分区间的长度轴等分区间的长度轴等分区间的长度(高高高高)*/)*/)*/)*/area=(*p)(a)+(*p)(b)/2.0;area=(*p)(a)+(*p)(b)/2.0;area=(*p)(a)+(*p)(b)/2.0;area=(*p)(a)+(*p)(b)/2.0;/*y/*y/*y/*y轴轴轴轴(f(a)+f(b)/2*/(f(a)+f(b)/2*/(f(a)+f(b)/2*/(f(a

13、)+f(b)/2*/for(i=1;in;i+)for(i=1;in;i+)for(i=1;in;i+)for(i=1;in;i+)area+=(*p)(a+i*h);area+=(*p)(a+i*h);area+=(*p)(a+i*h);area+=(*p)(a+i*h);/*f(X/*f(X/*f(X/*f(X1 1 1 1)+f(X)+f(X)+f(X)+f(X2 2 2 2)+)+)+)+f(Xf(Xf(Xf(Xn-1n-1n-1n-1)*/)*/)*/)*/return area*h;return area*h;return area*h;return area*h;n n 使用被积

14、函数名、积分下限和积分上限、等分数使用被积函数名、积分下限和积分上限、等分数使用被积函数名、积分下限和积分上限、等分数使用被积函数名、积分下限和积分上限、等分数作为实参在主调函数中调用求定积分通用函数。作为实参在主调函数中调用求定积分通用函数。作为实参在主调函数中调用求定积分通用函数。作为实参在主调函数中调用求定积分通用函数。调用指针变量所指的函数调用指针变量所指的函数调用指针变量所指的函数调用指针变量所指的函数函数指针为形参函数指针为形参函数指针为形参函数指针为形参第14页/共23页#include#include“ex05-04.cpp”/*通用函数包含到本源文件中*/double f1(

15、double x);/*被积函数的原型声明*/double f2(double x);void main()double y1,y2;int n;printf(Input number of sections:);scanf(%d,&n);y1=collect(f1,0,2,n);/*函数名为实参*/y2=collect(f2,-1,1,n);printf(y1=%fn,y1);printf(y2=%fn,y2);5.1.3 5.1.3 指向函数的指针变量作函数参数指向函数的指针变量作函数参数第15页/共23页double f1(double x)/*被积函数1+x的C语言描述*/double

16、 f;f=1+x;return f;double f2(double x)/*被积函数1/(1+4x2)的C语言描述*/double f;f=1/(1+4*x*x);return f;5.1.3 5.1.3 指向函数的指针变量作函数参数指向函数的指针变量作函数参数调用过程中的参数调用过程中的参数调用过程中的参数调用过程中的参数传递传递传递传递第16页/共23页C程序的控制结构指向函数的指针 返回指针值的函数 第17页/共23页5.2.1 5.2.1 返回指针值函数的定义和调用返回指针值函数的定义和调用 一般函数的返回值可以是整型、实型、字符型等基本数据类型,也可是空类型(void)或其它用户自

17、定义数据类型。如果函数在调用后返回一个指针值(地址),这种函数称为返回指针值的函数。返回指针值函数的头定义 (形式参数表形式参数表)注意区别以下定义 float *func(float x,float y)返回指针值的函数 float(*fper)(float x,float y)指向函数的指针变量返回指针值函数的调用 函数的返回值只能赋给相同数据类型的指针变量。第18页/共23页例5-6 用静态局部变量和返回指针函数求#include long*fac(long n);Void main()long n,i,sum=0,*pi;printf(Input n:);scanf(%ld,&n);f

18、or(i=1;i=n;i+)pi=fac(i);sum=sum+*pi;printf(Sum=%ldn,sum);long long long long*fac(long n)fac(long n)fac(long n)fac(long n)staticstaticstaticstatic long p=1;long p=1;long p=1;long p=1;p=p*n;p=p*n;p=p*n;p=p*n;return return return return&p;p;p;p;5.2.1 5.2.1 返回指针值函数的定义和调用返回指针值函数的定义和调用sum+=*fac(i)sum+=*fa

19、c(i)sum+=*fac(i)sum+=*fac(i)ppi1 1500050001 1 2 2 6 63 32 2 6 69 92 2 3111*11*21*2*32 2 3 3第19页/共23页不能把自动变量的地址作为函数的返回值 例5-7 返回自动变量地址值的错误程序#include#include void main()void main()int*fun();int*fun();int num,*count;int num,*count;for(num=1234;num=1;num-)for(num=1234;num=1;num-)if(num%3=0)if(num%3=0)cou

20、nt=fun();count=fun();printf(count=%dn,*count);printf(count=%dn,*count);int*fun()int*fun()int i;int i;i+;i+;return&i;return&i;使用自动变量,使用自动变量,程序有潜在问题程序有潜在问题5.2.1 5.2.1 返回指针值函数的定义和调用返回指针值函数的定义和调用第20页/共23页存储分配函数malloc(在头文件stdlib.h中)原型:原型:void*malloc(size_t);void*malloc(size_t);功能:在内存的动态存储区分配由size_t所指定大小的

21、存储块,返回该存储块的地址(指针)。返回指针类型为void(空类型),程序中应根据需要将它转换为所需的任何类型。如果存储器中没有足够的空间分配,即当存储分配失败时返回值为NULL。存储释放函数free(在头文件stdlib.h中)原型:void free(void*memblock);功能:释放由指针变量memblock指明首地址,并由malloc函数动态分配的存储块。例例5-85-8 使用使用mallocmalloc和和freefree函数的示例函数的示例1 15.2.2 5.2.2 存储分配标准库函数和动态变量存储分配标准库函数和动态变量第21页/共23页使用malloc和free函数的示例2#include#include Void main()int*ptr;ptr=(int*)malloc(sizeof(int);返回指针值函数的调用 if(ptr=NULL)printf(“Failed to create a new object.”);exit(0);*ptr=100;printf(“value of*ptr is:%dn”,*ptr);free(ptr);5.2.2 5.2.2 存储分配标准库函数和动态变量存储分配标准库函数和动态变量ptr100第22页/共23页感谢您的观看!第23页/共23页

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

当前位置:首页 > 应用文书 > PPT文档

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

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