这篇博文写一下函数指针:
先来说一下函数,如果定义了一个函数,在编译时,编译系统会为函数代码分配一段存储空间,,这段存储空间的起始地址称为这个函数的指针。
而指针变量顾名思义就是指向函数的指针,我们可以定义一个指向函数的指针变量,用来存放某一函数的起始地址,这就意味着此指针变量指向该函数。
函数指针定义的方法为:类型名(*指针变量名)(函数参数列表);
例如:int (*pt)(char,int);
这个语句定义了一个函数指针pt,它能指向返回值为整型,有一个字符型参数和一个整形参数的函数。
下面说一下使用方法:在给函数指针赋值时,只需给出函数名而不必给出参数。
定义一个函数:int length(char ch[],int n);
则将其赋给上面pt的语句为:pt=length;
调用的方法为:int result; result=(*pt)(ch[],n);
即只需用(*pt)
代替函数名length
。
函数指针的作用:指向函数的指针变量的一个重要用途是把函数的地址作为参数传递到其他函数。指向函数的指针可以作为函数参数,把函数的入口地址传递给形参,这样就能在被调用的函数中使用实参函数。它的原理可以简述如下:有一个函数(假设函数名为fun),它有两个形参(x1和x2),定义x1和x2为指向函数的指针变量。在调用函数fun时,实参为两个函数名f1和f2,给形参传递的是f1和f2的额入口地址,这样在fun中就可以调用f1和f2两个函数。如果每次调用fun函数时,要调用的函数不是固定的,这时用指针变量就比较方便了。只要在每次调用fun函数时给出不同的函数名作为参数即可,不必修改fun函数。
下面以求定积分为例来说明这一好处,求定积分的算法只有一个就是利用数学中将待求区间进行无限等分的方法(当然在计算机编程中这一点无法实现),计算出每一个近似小长方形的面积然后相加。然而函数却有很多个,如果写一个通用函数integra
,则对于不同的函数就要在其中进行不同的函数声明和相应修改。这样显然很不方便,而用了函数指针就会很简单,不同函数只需要在传实参时给出函数名就行。下面是代码示例。
#include <stdio.h>
#include <stdlib.h>
int main()
{
double integra(double (*p)(double),double a,double b,int n);
double fsin(double x); //这里一定要先声明函数,才可以使用函数指针。
double fcos(double x);
double fexp(double x);
double a1,b1,a2,b2,a3,b3,c;
double (*p)(double);
long int n=600000;
scanf("%lf %lf",&a1,&b1);
scanf("%lf %lf",&a2,&b2);
scanf("%lf %lf",&a3,&b3);
p=fsin;
c=integra(p,a1,b1,n);
printf("%.4lf\n",c);
p=fcos;
c=integra(p,a2,b2,n);
printf("%.4lf\n",c);
p=fexp;
c=integra(p,a3,b3,n);
printf("%.4lf\n",c);
return 0;
}
double integra(double (*p)(double),double a,double b,int n) //显然,在这里指针函数会比较好,简便,只要一个通用函数就可以了。
{
/*这个函数的原理就是从定积分的定义的来的,采用无限分割的思想*/
int i;
double x,h,s;
h=(b-a)/n;
x=a;
s=0;
for(i=1;i<=n;i++)
{
x=x+h;
s=s+(*p)(x)*h;
}
return s;
}
double fsin(double x)
{
return sin(x);
}
double fcos(double x)
{
return cos(x);
}
double fexp(double x)
{
return exp(x);
}