指针不仅可以指向数据,也可以指向函数,假设编写了integrated的函数用来求a和b点之间的函数f的积分。我们希望函数integrate通过传递f作为实际参数的方式变得更为通用
函数integrate的原型如下:
double integrate( double (*f)(double),double a, double b);
在*f周围的圆括号说明f是个指向函数的指针,而不是函数的返回值为指针,把f声明成好像就是函数也是合法的
double integrate( double f(double),double a, double b);
在编译器看来,这种原型和前一种形式是完全一样的
在调用函数integrate时,把一个函数名作为第一个实际参数,如:
result = integrate(sin,0,0,PI/2);
sin后边没有圆括号,当函数名后边没有圆括号时,c语言编译器会产生指向函数的指针来代替产生函数调用的代码,在此例中不是在调用函数sin,二十给函数integrate传递了一个指向函数sin的指针,和c语言处理数组一样,如果a是数组的名字,a[i]就表示数组的一个元素,而a本身作为指向数组的指针,类似,如果f是函数,那么c语言把f(x)当成函数的调用来处理,而f本身则是指向函数的指针
在integrate函数体内,可以调用f所指向的函数:例如:sum += (*f)(x);
c语言对待指向函数的指针就像对待指向数据的指针一样,我们可以把函数指针存储在变量中,或者用作数组的元素
void (*pf)(int) pf可以指向任何返回void以以一个int为参数的函数
函数指针数组有很大的用途, 例如正在编写的程序用来显示用户选择格式的命令菜单,可以编写函数实现这些命令,
void (*file_cmd[])(void) = {new_cmd,open_cmd,close_cmd,save_cmd}
再例如:
int (*s[10]) (int) 定义函数指针数组
float (**def)[10] :def 是一个二级指针,它指向的是一个一维数组的指针,数组的元素都是float
double *(*gh)[10];,gh是一个指针,它指向一个一维数组,它的元素都是double *的
double (*f[10])( ); :f是一个数组,f有10个元素,元素都是函数的指针,指向的函数类型都是没有参数,返回double类型的数据
int *(*b)[10]