《指针与函数》PPT课件

上传人:pu****.1 文档编号:592711679 上传时间:2024-09-22 格式:PPT 页数:23 大小:144.50KB
返回 下载 相关 举报
《指针与函数》PPT课件_第1页
第1页 / 共23页
《指针与函数》PPT课件_第2页
第2页 / 共23页
《指针与函数》PPT课件_第3页
第3页 / 共23页
《指针与函数》PPT课件_第4页
第4页 / 共23页
《指针与函数》PPT课件_第5页
第5页 / 共23页
点击查看更多>>
资源描述

《《指针与函数》PPT课件》由会员分享,可在线阅读,更多相关《《指针与函数》PPT课件(23页珍藏版)》请在金锄头文库上搜索。

1、程序设计技术程序设计技术n nC C C C语言数据描述和语言数据描述和语言数据描述和语言数据描述和C C C C程序设计初步程序设计初步程序设计初步程序设计初步 n n结构化程序设计基础和结构化程序设计基础和结构化程序设计基础和结构化程序设计基础和C C C C语言的控制结构语言的控制结构语言的控制结构语言的控制结构 n n数组及其应用数组及其应用数组及其应用数组及其应用 n n函数与函数与函数与函数与C C C C程序结构程序结构程序结构程序结构 n n指针与函数指针与函数指针与函数指针与函数 n n指针与数组指针与数组指针与数组指针与数组 n n字符串及其应用字符串及其应用字符串及其应用

2、字符串及其应用 n n结构体类型和联合体类型结构体类型和联合体类型结构体类型和联合体类型结构体类型和联合体类型 n nC C C C语言的文件处理及其应用语言的文件处理及其应用语言的文件处理及其应用语言的文件处理及其应用 n n位运算与枚举类型位运算与枚举类型位运算与枚举类型位运算与枚举类型指针与函数指针与函数n n指向函数的指针指向函数的指针指向函数的指针指向函数的指针 n n返回指针值的函数返回指针值的函数返回指针值的函数返回指针值的函数 指向函数的指针指向函数的指针n n指向函数指针变量的定义指向函数指针变量的定义指向函数指针变量的定义指向函数指针变量的定义 n n用指向函数的指针变量来

3、调用函数用指向函数的指针变量来调用函数用指向函数的指针变量来调用函数用指向函数的指针变量来调用函数 n n指向函数的指针变量作函数参数指向函数的指针变量作函数参数指向函数的指针变量作函数参数指向函数的指针变量作函数参数 5.1.1 5.1.1 指向函数指针变量的定义指向函数指针变量的定义n n指向函数的指针变量指向函数的指针变量指向函数的指针变量指向函数的指针变量(简称函数指针)(简称函数指针)(简称函数指针)(简称函数指针)n n每一个函数都是一个程序模块,这个模块在内存中都占有每一个函数都是一个程序模块,这个模块在内存中都占有每一个函数都是一个程序模块,这个模块在内存中都占有每一个函数都是

4、一个程序模块,这个模块在内存中都占有一片存储区,一片存储区,一片存储区,一片存储区,函数名函数名函数名函数名代表了该存储区的代表了该存储区的代表了该存储区的代表了该存储区的首地址首地址首地址首地址,称为函数,称为函数,称为函数,称为函数的入口地址的入口地址的入口地址的入口地址 。定义一个指针变量并且使它指向函数的入。定义一个指针变量并且使它指向函数的入。定义一个指针变量并且使它指向函数的入。定义一个指针变量并且使它指向函数的入口地址,就称这个指针变量为指向函数的指针变量。口地址,就称这个指针变量为指向函数的指针变量。口地址,就称这个指针变量为指向函数的指针变量。口地址,就称这个指针变量为指向函

5、数的指针变量。n n指向函数的指针变量的定义指向函数的指针变量的定义指向函数的指针变量的定义指向函数的指针变量的定义 (*(*(*(*指针变量名指针变量名指针变量名指针变量名)()()()(形参表形参表形参表形参表););););n n存储类别存储类别存储类别存储类别 函数指针变量本身的存储特性;函数指针变量本身的存储特性;函数指针变量本身的存储特性;函数指针变量本身的存储特性; n n数据类型数据类型数据类型数据类型 指针指向的指针指向的指针指向的指针指向的函数的返回值类型;函数的返回值类型;函数的返回值类型;函数的返回值类型;n n给指向函数的指针变量赋值:给指向函数的指针变量赋值:给指向

6、函数的指针变量赋值:给指向函数的指针变量赋值: 指向函数的指针变量函数名指向函数的指针变量函数名指向函数的指针变量函数名指向函数的指针变量函数名; ; ; ; n n函数指针的调用格式函数指针的调用格式函数指针的调用格式函数指针的调用格式 (* (* (* (*函数指针变量函数指针变量函数指针变量函数指针变量)()()()(实参表实参表实参表实参表)指向函数的指针指向函数的指针n n指向函数指针变量的定义指向函数指针变量的定义指向函数指针变量的定义指向函数指针变量的定义 n n用指向函数的指针变量来调用函数用指向函数的指针变量来调用函数用指向函数的指针变量来调用函数用指向函数的指针变量来调用函

7、数 n n指向函数的指针变量作函数参数指向函数的指针变量作函数参数指向函数的指针变量作函数参数指向函数的指针变量作函数参数 定义指向函数的指针变量后,就可将一个定义指向函数的指针变量后,就可将一个定义指向函数的指针变量后,就可将一个定义指向函数的指针变量后,就可将一个函数名函数名函数名函数名赋给赋给赋给赋给该指针变量。此后,对该指针变量的指针运算就是使该指针变量。此后,对该指针变量的指针运算就是使该指针变量。此后,对该指针变量的指针运算就是使该指针变量。此后,对该指针变量的指针运算就是使程序控制转移到指针指向的程序控制转移到指针指向的程序控制转移到指针指向的程序控制转移到指针指向的函数入口地址

8、函数入口地址函数入口地址函数入口地址去执行该函去执行该函去执行该函去执行该函数的函数体。数的函数体。数的函数体。数的函数体。例如:有函数说明为:例如:有函数说明为:例如:有函数说明为:例如:有函数说明为: void swap(int x,int y)void swap(int x,int y)void swap(int x,int y)void swap(int x,int y); 指向函数的指针变量定义:指向函数的指针变量定义:指向函数的指针变量定义:指向函数的指针变量定义: void (*fp)(int x,int y);void (*fp)(int x,int y);void (*fp)

9、(int x,int y);void (*fp)(int x,int y); 将函数名将函数名将函数名将函数名swapswapswapswap赋给函数指针变量赋给函数指针变量赋给函数指针变量赋给函数指针变量fpfpfpfp: fp=swap;fp=swap;fp=swap;fp=swap; 使用函数指针变量使用函数指针变量使用函数指针变量使用函数指针变量fpfpfpfp调用函数调用函数调用函数调用函数swapswapswapswap的形式:的形式:的形式:的形式: (*fp)(a,b)(*fp)(a,b)(*fp)(a,b)(*fp)(a,b) fp(a,b)fp(a,b)fp(a,b)fp(

10、a,b); ; ; ; 5.1.2 5.1.2 用指向函数的指针变量调用函数用指向函数的指针变量调用函数例例例例5-1 5-1 5-1 5-1 编程序计算下面的公式,其中编程序计算下面的公式,其中n n从键盘输从键盘输入,要求使用指向函数的指针变量来实现。入,要求使用指向函数的指针变量来实现。(n(n(n(n为奇数时为奇数时为奇数时为奇数时) ) ) )(n(n(n(n为偶数时为偶数时为偶数时为偶数时) ) ) )5.1.2 5.1.2 用指向函数的指针变量调用函数用指向函数的指针变量调用函数5.1.2 5.1.2 用指向函数的指针变量调用函数用指向函数的指针变量调用函数FFTT图图图图5.1

11、 5.1 5.1 5.1 程序算法描述程序算法描述程序算法描述程序算法描述开始开始n=1n=1n%2=0n%2=0fp=f1fp=f1fp=f2fp=f2(*fp)(n)(*fp)(n)调用函数调用函数结束结束输入输入n n值值输出结果输出结果输出数据错误输出数据错误根据以上算法描述写出程序代码如下:根据以上算法描述写出程序代码如下:根据以上算法描述写出程序代码如下:根据以上算法描述写出程序代码如下:#include #include #include #include double f1(int x),f2(int x);double f1(int x),f2(int x);double f

12、1(int x),f2(int x);double f1(int x),f2(int x);void main()void main()void main()void main() double (*fp)(int x);double (*fp)(int x);double (*fp)(int x);double (*fp)(int x); /* /* /* /*定义指向函数的指针变量定义指向函数的指针变量定义指向函数的指针变量定义指向函数的指针变量fp*/fp*/fp*/fp*/ int n; int n; int n; int n; printf(“input n printf(“inpu

13、t n printf(“input n printf(“input n:”);”);”);”); scanf(“%d”,&n); scanf(“%d”,&n); scanf(“%d”,&n); scanf(“%d”,&n); if(n=1) if(n=1) if(n=1) if(n=1) if(n%2=0) if(n%2=0) if(n%2=0) if(n%2=0) fp=f1;fp=f1;fp=f1;fp=f1; /*n /*n /*n /*n为偶数,指针变量为偶数,指针变量为偶数,指针变量为偶数,指针变量fpfpfpfp指向函数指向函数指向函数指向函数f1()*/f1()*/f1()*/f

14、1()*/ else else else else fp=f2;fp=f2;fp=f2;fp=f2; /*n /*n /*n /*n为奇数,指针变量为奇数,指针变量为奇数,指针变量为奇数,指针变量fpfpfpfp指向函数指向函数指向函数指向函数f2()*/f2()*/f2()*/f2()*/ printf(“value=%9.4fn”, printf(“value=%9.4fn”, printf(“value=%9.4fn”, printf(“value=%9.4fn”,(*fp)(n)(*fp)(n)(*fp)(n)(*fp)(n); /*); /*); /*); /*用函数指针调用函数用函

15、数指针调用函数用函数指针调用函数用函数指针调用函数*/*/*/*/ else else else else printf(“Data error!n”); printf(“Data error!n”); printf(“Data error!n”); printf(“Data error!n”); 5.1.2 5.1.2 5.1.2 5.1.2 用指向函数的指针变量调用函数用指向函数的指针变量调用函数用指向函数的指针变量调用函数用指向函数的指针变量调用函数66double f1(int x)double f1(int x)double f1(int x)double f1(int x) int

16、 k;int k;int k;int k;double value=1.0;double value=1.0;double value=1.0;double value=1.0;for(k=2;k=x;k=k+2)for(k=2;k=x;k=k+2)for(k=2;k=x;k=k+2)for(k=2;k=x;k=k+2) value=value+(1.0/k)*(1.0/k); value=value+(1.0/k)*(1.0/k); value=value+(1.0/k)*(1.0/k); value=value+(1.0/k)*(1.0/k); return value;return va

17、lue;return value;return value; double f2(int x)double f2(int x)double f2(int x)double f2(int x) int k;int k;int k;int k;double value=1.0;double value=1.0;double value=1.0;double value=1.0;for(k=3;k=x;k=k+2)for(k=3;k=x;k=k+2)for(k=3;k=x;k=k+2)for(k=3;k=x;k=k+2) value=value+(1.0/k)*(1.0/k); value=valu

18、e+(1.0/k)*(1.0/k); value=value+(1.0/k)*(1.0/k); value=value+(1.0/k)*(1.0/k); return value;return value;return value;return value; 5.1.2 5.1.2 5.1.2 5.1.2 用指向函数的指针变量调用函数用指向函数的指针变量调用函数用指向函数的指针变量调用函数用指向函数的指针变量调用函数6222222指向函数的指针指向函数的指针n n指向函数指针变量的定义指向函数指针变量的定义指向函数指针变量的定义指向函数指针变量的定义 n n用指向函数的指针变量来调用函数用指向

19、函数的指针变量来调用函数用指向函数的指针变量来调用函数用指向函数的指针变量来调用函数 n n指向函数的指针变量作函数参数指向函数的指针变量作函数参数指向函数的指针变量作函数参数指向函数的指针变量作函数参数 5.1.3 5.1.3 指向函数的指针变量作函数参数指向函数的指针变量作函数参数n n程序中如何设计通用方法程序中如何设计通用方法程序中如何设计通用方法程序中如何设计通用方法 主要解决两个问题:主要解决两个问题:主要解决两个问题:主要解决两个问题:n n如何用如何用如何用如何用C C C C语言描述解决某种问题的通用方法语言描述解决某种问题的通用方法语言描述解决某种问题的通用方法语言描述解决

20、某种问题的通用方法n n如何将具体问题与解决问题的通用方法联系如何将具体问题与解决问题的通用方法联系如何将具体问题与解决问题的通用方法联系如何将具体问题与解决问题的通用方法联系 通用方法可应用于求解高阶方程的根、求多元方程通用方法可应用于求解高阶方程的根、求多元方程通用方法可应用于求解高阶方程的根、求多元方程通用方法可应用于求解高阶方程的根、求多元方程组的解、求函数的定积分等。组的解、求函数的定积分等。组的解、求函数的定积分等。组的解、求函数的定积分等。n n函数指针的作用函数指针的作用函数指针的作用函数指针的作用 主要在程序的函数之间传递函数,即把一个函数的主要在程序的函数之间传递函数,即把

21、一个函数的主要在程序的函数之间传递函数,即把一个函数的主要在程序的函数之间传递函数,即把一个函数的地址作为参数从一个函数传递到另外一个函数。一地址作为参数从一个函数传递到另外一个函数。一地址作为参数从一个函数传递到另外一个函数。一地址作为参数从一个函数传递到另外一个函数。一般主调函数的般主调函数的般主调函数的般主调函数的实参实参实参实参应当是被传递的应当是被传递的应当是被传递的应当是被传递的函数名函数名函数名函数名,而被调,而被调,而被调,而被调函数的函数的函数的函数的形参形参形参形参应该是能接收函数地址的应该是能接收函数地址的应该是能接收函数地址的应该是能接收函数地址的函数指针函数指针函数指

22、针函数指针( ( ( (指向指向指向指向函数的指针变量函数的指针变量函数的指针变量函数的指针变量) ) ) )。5.1.3 5.1.3 指向函数的指针变量作函数参数指向函数的指针变量作函数参数 例例例例5-5 5-5 5-5 5-5 利用已有的利用已有的利用已有的利用已有的通用函数通用函数通用函数通用函数按给定条件求定积分。按给定条件求定积分。按给定条件求定积分。按给定条件求定积分。其中确定精度的等分数从键盘输入。其中确定精度的等分数从键盘输入。其中确定精度的等分数从键盘输入。其中确定精度的等分数从键盘输入。 (1) (1) (1) (1)求函数求函数求函数求函数f f f f1 1 1 1(

23、x)=(x)=(x)=(x)=(1+x)1+x)1+x)1+x)在区间在区间在区间在区间0,20,20,20,2的定积分。的定积分。的定积分。的定积分。 (2) (2) (2) (2)求函数求函数求函数求函数f f f f2 2 2 2(x)=1/(1+4x(x)=1/(1+4x(x)=1/(1+4x(x)=1/(1+4x2 2 2 2) ) ) )在区间在区间在区间在区间-1,1-1,1-1,1-1,1的定积分的定积分的定积分的定积分 求求求求定积分定积分定积分定积分的方法:的方法:的方法:的方法:矩形法、梯形法、辛普生法矩形法、梯形法、辛普生法矩形法、梯形法、辛普生法矩形法、梯形法、辛普生

24、法。 以梯形法为例,设计求定积分的通用函数步骤:以梯形法为例,设计求定积分的通用函数步骤:以梯形法为例,设计求定积分的通用函数步骤:以梯形法为例,设计求定积分的通用函数步骤:n n将区间将区间将区间将区间a,ba,ba,ba,b划分为划分为划分为划分为n n n n等分等分等分等分,等分数取决于所求,等分数取决于所求,等分数取决于所求,等分数取决于所求精度;精度;精度;精度;n n计算出所有等分点的函数值计算出所有等分点的函数值计算出所有等分点的函数值计算出所有等分点的函数值f(xf(xf(xf(xi i i i) ) ) ); n n连接相邻两个等分点的函数值,将所求曲边四连接相邻两个等分点

25、的函数值,将所求曲边四连接相邻两个等分点的函数值,将所求曲边四连接相邻两个等分点的函数值,将所求曲边四边形区域用若干个小的梯形代替边形区域用若干个小的梯形代替边形区域用若干个小的梯形代替边形区域用若干个小的梯形代替; ; ; ; n n按公式求出所有小的梯形面积,然后求和得到按公式求出所有小的梯形面积,然后求和得到按公式求出所有小的梯形面积,然后求和得到按公式求出所有小的梯形面积,然后求和得到曲边四边形面积的近似值;曲边四边形面积的近似值;曲边四边形面积的近似值;曲边四边形面积的近似值;n n用求梯形面积的方法计算某区间的定积分用求梯形面积的方法计算某区间的定积分用求梯形面积的方法计算某区间的

26、定积分用求梯形面积的方法计算某区间的定积分n n将将将将a,ba,ba,ba,b区间区间区间区间n n n n等分等分等分等分, , , ,则梯形的高则梯形的高则梯形的高则梯形的高h=(b-a)/nh=(b-a)/nh=(b-a)/nh=(b-a)/nn n求梯形面积的求梯形面积的求梯形面积的求梯形面积的计算计算计算计算公式公式公式公式: : : : S = (f(XS = (f(XS = (f(XS = (f(Xi i i i)+f(X)+f(X)+f(X)+f(Xi+1i+1i+1i+1)*h)*h)*h)*hn n在在在在X X X X轴除轴除轴除轴除a a a a、b b b b点外,

27、其余点的函数值都加了两点外,其余点的函数值都加了两点外,其余点的函数值都加了两点外,其余点的函数值都加了两次,既是一个梯形的上边,又是另一个梯形的次,既是一个梯形的上边,又是另一个梯形的次,既是一个梯形的上边,又是另一个梯形的次,既是一个梯形的上边,又是另一个梯形的下边;仅有下边;仅有下边;仅有下边;仅有 a a a a、b b b b点的函数值点的函数值点的函数值点的函数值f(a)f(a)f(a)f(a)或或或或f(b)f(b)f(b)f(b)只为只为只为只为某梯形的上边或下边,故程序特殊处理为:某梯形的上边或下边,故程序特殊处理为:某梯形的上边或下边,故程序特殊处理为:某梯形的上边或下边,

28、故程序特殊处理为: a a a a和和和和b b b b点:点:点:点:area=(f(a)+f(b)/2area=(f(a)+f(b)/2area=(f(a)+f(b)/2area=(f(a)+f(b)/2 i i i i取取取取1 1 1 1n-1n-1n-1n-1点:点:点:点:area=area+f(a+i*h)area=area+f(a+i*h)area=area+f(a+i*h)area=area+f(a+i*h)5.1.3 5.1.3 5.1.3 5.1.3 指向函数的指针变量作函数参数指向函数的指针变量作函数参数指向函数的指针变量作函数参数指向函数的指针变量作函数参数5.1.3

29、 5.1.3 指向函数的指针变量作函数参数指向函数的指针变量作函数参数n n 按梯形法求定积分的通用函数按梯形法求定积分的通用函数按梯形法求定积分的通用函数按梯形法求定积分的通用函数collectcollectcollectcollectdouble double double double collect(collect(collect(collect(doubledoubledoubledouble (* (* (* (*p)(floatp)(floatp)(floatp)(float x)x)x)x),float,float,float,float a,floata,floata,flo

30、ata,float b,intb,intb,intb,int n) n) n) n) intintintint i; i; i; i; float float float float f,h,areaf,h,areaf,h,areaf,h,area; ; ; ; h=( h=( h=( h=(b-a)/nb-a)/nb-a)/nb-a)/n; ; ; ; /*X/*X/*X/*X轴等分区间的长度轴等分区间的长度轴等分区间的长度轴等分区间的长度( ( ( (高高高高)*/)*/)*/)*/ area=(* area=(* area=(* area=(*p)(ap)(ap)(ap)(a)+(*p)

31、(b)/2.0; )+(*p)(b)/2.0; )+(*p)(b)/2.0; )+(*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)+f(b)/2 */ for(ifor(ifor(ifor(i=1;i=1;i=1;i=1;in;in;in;in;i+)+)+)+) area+=(* area+=(* area+=(* area+=(*p)(a+ip)(a+ip)(a+ip)(a+i*h); *h); *h); *h); /*f(X/*f(X/*f(X/*f(X1 1 1 1)+f(X)

32、+f(X)+f(X)+f(X2 2 2 2)+f(X)+f(X)+f(X)+f(Xn-1n-1n-1n-1)*/)*/)*/)*/ return area*h; return area*h; return area*h; return area*h; n n 使用被积函数名、积分下限和积分上限、等分数使用被积函数名、积分下限和积分上限、等分数使用被积函数名、积分下限和积分上限、等分数使用被积函数名、积分下限和积分上限、等分数作为实参在主调函数中调用求定积分通用函数。作为实参在主调函数中调用求定积分通用函数。作为实参在主调函数中调用求定积分通用函数。作为实参在主调函数中调用求定积分通用函数。调用

33、指针变量所指的函数调用指针变量所指的函数调用指针变量所指的函数调用指针变量所指的函数函数指针为形参函数指针为形参函数指针为形参函数指针为形参#include #include #include #include #include “ex05-04.cpp” #include “ex05-04.cpp” #include “ex05-04.cpp” #include “ex05-04.cpp” /*/*/*/*通用函数包含到本源文件中通用函数包含到本源文件中通用函数包含到本源文件中通用函数包含到本源文件中*/*/*/*/double f1(double x); double f1(double

34、x); double f1(double x); double f1(double x); /*/*/*/*被积函数的原型声明被积函数的原型声明被积函数的原型声明被积函数的原型声明*/*/*/*/double f2(double x);double f2(double x);double f2(double x);double f2(double x);void main() void main() void main() void main() double y1,y2; double y1,y2; double y1,y2; double y1,y2; int n; int n; int

35、n; int n; printf(Input number of sections:); printf(Input number of sections:); printf(Input number of sections:); printf(Input number of sections:);scanf(%d,&n);scanf(%d,&n);scanf(%d,&n);scanf(%d,&n);y1=collect(y1=collect(y1=collect(y1=collect(f1f1f1f1,0,2,n); ,0,2,n); ,0,2,n); ,0,2,n); /*/*/*/*函数名

36、为实参函数名为实参函数名为实参函数名为实参*/*/*/*/y2=collect(y2=collect(y2=collect(y2=collect(f2f2f2f2,-1,1,n);,-1,1,n);,-1,1,n);,-1,1,n);printf(y1=%fn,y1);printf(y1=%fn,y1);printf(y1=%fn,y1);printf(y1=%fn,y1);printf(y2=%fn,y2);printf(y2=%fn,y2);printf(y2=%fn,y2);printf(y2=%fn,y2); 5.1.3 5.1.3 5.1.3 5.1.3 指向函数的指针变量作函数参数

37、指向函数的指针变量作函数参数指向函数的指针变量作函数参数指向函数的指针变量作函数参数double f1(double x) /*double f1(double x) /*double f1(double x) /*double f1(double x) /*被积函数被积函数被积函数被积函数1+x1+x1+x1+x的的的的C C C C语言描述语言描述语言描述语言描述*/*/*/*/ double f;double f;double f;double f;f=1+x;f=1+x;f=1+x;f=1+x;return f;return f;return f;return f; double f2

38、(double x) /*double f2(double x) /*double f2(double x) /*double f2(double x) /*被积函数被积函数被积函数被积函数1/(1+4x1/(1+4x1/(1+4x1/(1+4x2 2 2 2) ) ) )的的的的C C C C语言描述语言描述语言描述语言描述*/*/*/*/ double f;double f;double f;double f;f=1/(1+4*x*x);f=1/(1+4*x*x);f=1/(1+4*x*x);f=1/(1+4*x*x);return f;return f;return f;return f

39、; 5.1.3 5.1.3 5.1.3 5.1.3 指向函数的指针变量作函数参数指向函数的指针变量作函数参数指向函数的指针变量作函数参数指向函数的指针变量作函数参数调用过程中的调用过程中的调用过程中的调用过程中的参数传递参数传递参数传递参数传递C程序的控制结构程序的控制结构n n指向函数的指针指向函数的指针指向函数的指针指向函数的指针 n n返回指针值的函数返回指针值的函数返回指针值的函数返回指针值的函数 5.2.1 5.2.1 返回指针值函数的定义和调用返回指针值函数的定义和调用 一般函数的返回值可以是整型、实型、字符型等基一般函数的返回值可以是整型、实型、字符型等基一般函数的返回值可以是整

40、型、实型、字符型等基一般函数的返回值可以是整型、实型、字符型等基本数据类型,也可是空类型(本数据类型,也可是空类型(本数据类型,也可是空类型(本数据类型,也可是空类型(voidvoidvoidvoid)或其它用户自)或其它用户自)或其它用户自)或其它用户自定义数据类型。如果函数在调用后返回一个指针值定义数据类型。如果函数在调用后返回一个指针值定义数据类型。如果函数在调用后返回一个指针值定义数据类型。如果函数在调用后返回一个指针值(地址地址地址地址),这种函数称为返回指针值的函数。),这种函数称为返回指针值的函数。),这种函数称为返回指针值的函数。),这种函数称为返回指针值的函数。n n返回指针

41、值函数的头定义返回指针值函数的头定义返回指针值函数的头定义返回指针值函数的头定义 (形式参数表形式参数表形式参数表形式参数表) ) ) )n n注意区别以下定义注意区别以下定义注意区别以下定义注意区别以下定义 float *func(float x,float y)float *func(float x,float y)float *func(float x,float y)float *func(float x,float y) 返回指针值的函数返回指针值的函数返回指针值的函数返回指针值的函数 float (*fper)(float x,float y)float (*fper)(float

42、 x,float y)float (*fper)(float x,float y)float (*fper)(float x,float y) 指向函数的指针变量指向函数的指针变量指向函数的指针变量指向函数的指针变量n n返回指针值函数的调用返回指针值函数的调用返回指针值函数的调用返回指针值函数的调用 函数的返回值只能赋给相同数据类型的指针变量。函数的返回值只能赋给相同数据类型的指针变量。函数的返回值只能赋给相同数据类型的指针变量。函数的返回值只能赋给相同数据类型的指针变量。例例例例5-6 5-6 5-6 5-6 用静态局部变量和返回指针函数求用静态局部变量和返回指针函数求用静态局部变量和返回

43、指针函数求用静态局部变量和返回指针函数求#include #include #include #include long *fac(long n)long *fac(long n)long *fac(long n)long *fac(long n);Void main()Void main()Void main()Void main() long n,i,sum=0,*pi;long n,i,sum=0,*pi;long n,i,sum=0,*pi;long n,i,sum=0,*pi;printf(Input n:);printf(Input n:);printf(Input n:);pri

44、ntf(Input n:); scanf(%ld,&n); scanf(%ld,&n); scanf(%ld,&n); scanf(%ld,&n); for(i=1;i=n;i+) for(i=1;i=n;i+) for(i=1;i=n;i+) for(i=1;i=n;i+) pi=fac(i); pi=fac(i); pi=fac(i); pi=fac(i); sum=sum+ sum=sum+ sum=sum+ sum=sum+*pi*pi*pi*pi; ; ; ; printf(Sum=%ldn,sum); printf(Sum=%ldn,sum); printf(Sum=%ldn,su

45、m); 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+=*fac(i)sum+

46、=*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 3n n不能把自动变量的地不能把自动变量的地不能把自动变量的地不能把自动变量的地址作为函数的返回值址作为函数的返回值址作为函数的返回值址作为函数的返回值 例例例例5-7 5-7 5-7 5-7 返回自动变量返回自动变量返回自动变量返回自动变量地址值的错误程序地址值的错误程序地址值的错误程序地址值的错误程序 #include #include void main()void main() int *fun(); int *fun();

47、 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) count=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 返回指针值函数的定义

48、和调用返回指针值函数的定义和调用n n存储分配函数存储分配函数存储分配函数存储分配函数malloc malloc malloc malloc ( ( ( (在头文件中)在头文件中)在头文件中)在头文件中)原型:原型:原型:原型:void *malloc(size_t);void *malloc(size_t);void *malloc(size_t);void *malloc(size_t); 功能:在内存的动态存储区分配由功能:在内存的动态存储区分配由功能:在内存的动态存储区分配由功能:在内存的动态存储区分配由size_tsize_tsize_tsize_t所指定大小的存储所指定大小的存储所

49、指定大小的存储所指定大小的存储块,返回该存储块的地址(指针)。返回指针类型为块,返回该存储块的地址(指针)。返回指针类型为块,返回该存储块的地址(指针)。返回指针类型为块,返回该存储块的地址(指针)。返回指针类型为voidvoidvoidvoid(空类型),程序中应根据需要将它转换为所需的任(空类型),程序中应根据需要将它转换为所需的任(空类型),程序中应根据需要将它转换为所需的任(空类型),程序中应根据需要将它转换为所需的任何类型。如果存储器中没有足够的空间分配,即当存储分何类型。如果存储器中没有足够的空间分配,即当存储分何类型。如果存储器中没有足够的空间分配,即当存储分何类型。如果存储器中

50、没有足够的空间分配,即当存储分配失败时返回值为配失败时返回值为配失败时返回值为配失败时返回值为NULLNULLNULLNULL。n n存储释放函数存储释放函数存储释放函数存储释放函数freefreefreefree ( ( ( (在头文件中)在头文件中)在头文件中)在头文件中) 原型:原型:原型:原型:void free( void *memblock );void free( void *memblock );void free( void *memblock );void free( void *memblock );功能:释放由指针变量功能:释放由指针变量功能:释放由指针变量功能:释放由

51、指针变量memblockmemblockmemblockmemblock指明首地址,并由指明首地址,并由指明首地址,并由指明首地址,并由mallocmallocmallocmalloc函数函数函数函数动态分配的存储块。动态分配的存储块。动态分配的存储块。动态分配的存储块。例例例例5-8 5-8 5-8 5-8 使用使用使用使用mallocmallocmallocmalloc和和和和freefreefreefree函数的示例函数的示例函数的示例函数的示例1 1 1 15.2.2 5.2.2 5.2.2 5.2.2 存储分配标准库函数和动态变量存储分配标准库函数和动态变量存储分配标准库函数和动态变

52、量存储分配标准库函数和动态变量使用使用使用使用mallocmallocmallocmalloc和和和和freefreefreefree函数的示例函数的示例函数的示例函数的示例2 2 2 2#include #include #include #include #include #include #include #include Void main()Void main()Void main()Void main() int *ptr; int *ptr; int *ptr; int *ptr; ptr= ptr= ptr= ptr=(int *)(int *)(int *)(int *)ma

53、lloc(sizeof(int); malloc(sizeof(int); malloc(sizeof(int); malloc(sizeof(int); 返回指针值函数的调用返回指针值函数的调用返回指针值函数的调用返回指针值函数的调用 if if if if (ptr=NULL)(ptr=NULL)(ptr=NULL)(ptr=NULL) printf(“Failed to create a new object.”); printf(“Failed to create a new object.”); printf(“Failed to create a new object.”); pr

54、intf(“Failed to create a new object.”); exit(0);exit(0);exit(0);exit(0); *ptr=100; *ptr=100; *ptr=100; *ptr=100; printf(“value of *ptr is:%dn”,*ptr); printf(“value of *ptr is:%dn”,*ptr); printf(“value of *ptr is:%dn”,*ptr); printf(“value of *ptr is:%dn”,*ptr); free(ptr); free(ptr); free(ptr); free(ptr);5.2.2 5.2.2 5.2.2 5.2.2 存储分配标准库函数和动态变量存储分配标准库函数和动态变量存储分配标准库函数和动态变量存储分配标准库函数和动态变量ptr100

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号