《第5章指针与函数课件》由会员分享,可在线阅读,更多相关《第5章指针与函数课件(23页珍藏版)》请在金锄头文库上搜索。
1、程序设计技术,C语言数据描述和C程序设计初步 结构化程序设计基础和C语言的控制结构 数组及其应用 函数与C程序结构 指针与函数 指针与数组 字符串及其应用 结构体类型和联合体类型 C语言的文件处理及其应用 位运算与枚举类型,指针与函数,指向函数的指针 返回指针值的函数,指向函数的指针,指向函数指针变量的定义 用指向函数的指针变量来调用函数 指向函数的指针变量作函数参数,5.1.1 指向函数指针变量的定义,指向函数的指针变量(简称函数指针) 每一个函数都是一个程序模块,这个模块在内存中都占有一片存储区,函数名代表了该存储区的首地址,称为函数的入口地址 。定义一个指针变量并且使它指向函数的入口地址
2、,就称这个指针变量为指向函数的指针变量。 指向函数的指针变量的定义 (*指针变量名)(形参表); 存储类别 函数指针变量本身的存储特性; 数据类型 指针指向的函数的返回值类型; 给指向函数的指针变量赋值: 指向函数的指针变量函数名; 函数指针的调用格式 (*函数指针变量)(实参表),指向函数的指针,指向函数指针变量的定义 用指向函数的指针变量来调用函数 指向函数的指针变量作函数参数,定义指向函数的指针变量后,就可将一个函数名赋给该指针变量。此后,对该指针变量的指针运算就是使程序控制转移到指针指向的函数入口地址去执行该函数的函数体。 例如:有函数说明为: void swap(int x,int
3、y); 指向函数的指针变量定义: void (*fp)(int x,int y); 将函数名swap赋给函数指针变量fp: fp=swap; 使用函数指针变量fp调用函数swap的形式: (*fp)(a,b) fp(a,b);,5.1.2 用指向函数的指针变量调用函数,例5-1 编程序计算下面的公式,其中n从键盘输入,要求使用指向函数的指针变量来实现。,5.1.2 用指向函数的指针变量调用函数,5.1.2 用指向函数的指针变量调用函数,根据以上算法描述写出程序代码如下: #include double f1(int x),f2(int x); void main() double (*fp)(
4、int x); /*定义指向函数的指针变量fp*/ int n; printf(“input n:”); scanf(“%d”, ,5.1.2 用指向函数的指针变量调用函数,6,6,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、5.1.2 用指向函数的指针变量调用函数,6,1+1.0/22+1.0/42+1.0/62,指向函数的指针,指向函数指针变量的定义 用指向函数的指针变量来调用函数 指向函数的指针变量作函数参数,5.1.3 指向函数的指针变量作函数参数,程序中如何设计通用方法 主要解决两个问题: 如何用C语言描述解决某种问题的通用方法 如何将具体问题与解决问题的通用方法联系 通用方法可应用于求解高阶方程的根、求多元方程组的解、求函数的定积分等。 函数指针的作用 主要在程序的函数之间传递函数,即把一个函数的地址作为参数从一个函数传递到另外一个函数。一般主调函数的实参应当是被传递的函数名,而被调函数的形参应该是能接
6、收函数地址的函数指针(指向函数的指针变量)。,5.1.3 指向函数的指针变量作函数参数,例5-5 利用已有的通用函数按给定条件求定积分。其中确定精度的等分数从键盘输入。 (1)求函数f1(x)=(1+x)在区间0,2的定积分。 (2)求函数f2(x)=1/(1+4x2)在区间-1,1的定积分 求定积分的方法:矩形法、梯形法、辛普生法。 以梯形法为例,设计求定积分的通用函数步骤: 将区间a,b划分为n等分,等分数取决于所求精度; 计算出所有等分点的函数值f(xi); 连接相邻两个等分点的函数值,将所求曲边四边形区域用若干个小的梯形代替; 按公式求出所有小的梯形面积,然后求和得到曲边四边形面积的近
7、似值;,用求梯形面积的方法计算某区间的定积分 将a,b区间n等分,则梯形的高h=(b-a)/n 求梯形面积的计算公式: 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 指向函数的指针变量作函数参数,按梯形法求定积分的通用函数collect double collect(doubl
8、e (*p)(float x),float a,float b,int n) int i; float f,h,area; h=(b-a)/n; /*X轴等分区间的长度(高)*/ area=(*p)(a)+(*p)(b)/2.0; /*y轴(f(a)+f(b)/2 */ for(i=1;in;i+) area+=(*p)(a+i*h); /*f(X1)+f(X2)+f(Xn-1)*/ return area*h; 使用被积函数名、积分下限和积分上限、等分数作为实参在主调函数中调用求定积分通用函数。,调用指针变量所指的函数,函数指针为形参,#include #include “ex05-04.c
9、pp” /*通用函数包含到本源文件中*/ double f1(double x); /*被积函数的原型声明*/ double f2(double x); void main() double y1,y2; int n; printf(Input number of sections:); scanf(%d, ,5.1.3 指向函数的指针变量作函数参数,double f1(double x) /*被积函数1+x的C语言描述*/ double f; f=1+x; return f; double f2(double x) /*被积函数1/(1+4x2)的C语言描述*/ double f; f=1/
10、(1+4*x*x); return f; ,5.1.3 指向函数的指针变量作函数参数,调用过程中的参数传递,C程序的控制结构,指向函数的指针 返回指针值的函数,5.2.1 返回指针值函数的定义和调用,一般函数的返回值可以是整型、实型、字符型等基本数据类型,也可是空类型(void)或其它用户自定义数据类型。如果函数在调用后返回一个指针值(地址),这种函数称为返回指针值的函数。 返回指针值函数的头定义 (形式参数表) 注意区别以下定义 float *func(float x,float y) 返回指针值的函数 float (*fper)(float x,float y) 指向函数的指针变量 返回指
11、针值函数的调用 函数的返回值只能赋给相同数据类型的指针变量。,例5-6 用静态局部变量和返回指针函数求 #include long *fac(long n); Void main() long n,i,sum=0,*pi; printf(Input n:); scanf(%ld, ,long *fac(long n) static long p=1; p=p*n; return ,5.2.1 返回指针值函数的定义和调用,sum+=*fac(i),1,2,6,3,2,6,9,2,3,1,1,1*1,1*2,1*2*3,2,3,不能把自动变量的地址作为函数的返回值 例5-7 返回自动变量地址值的错
12、误程序,#include void main() int *fun(); int num,*count; for(num=1234;num=1;num-) if(num%3=0) count=fun(); printf(count=%dn,*count); int *fun() int i; i+; return ,5.2.1 返回指针值函数的定义和调用,存储分配函数malloc (在头文件stdlib.h中) 原型:void *malloc(size_t); 功能:在内存的动态存储区分配由size_t所指定大小的存储块,返回该存储块的地址(指针)。返回指针类型为void(空类型),程序中应根
13、据需要将它转换为所需的任何类型。如果存储器中没有足够的空间分配,即当存储分配失败时返回值为NULL。 存储释放函数free (在头文件stdlib.h中) 原型:void free( void *memblock ); 功能:释放由指针变量memblock指明首地址,并由malloc函数动态分配的存储块。 例5-8 使用malloc和free函数的示例1,5.2.2 存储分配标准库函数和动态变量,使用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 存储分配标准库函数和动态变量,ptr,100,