函数不是变量,但它在内存中仍然需要占据一定的存储空间,如果将函数的入口地址赋给一个指针,该指针就是函数型指针。由于函数型指针指向的是函数入口地址,因此在进行函数调用时可用指向函数的指针代替被调用的函数名。C语言中函数与变量不同,函数名不能作为参数直接传递给另一个函数。但是利用函数型指针,可以将函数作为参数传递给另一个函数。此外还可以将函数型指针放在一个指针数组中,则该指针数组的每一个元素都是指向某个函数的指针。
定义一个函数型指针的一般形式为:
数据类型 (*标识符)()
其中,“标识符”就是所定义的函数型指针变量名。
“数据类型”说明了该指针所指向的函数返回值的类型。例如:
int (*func1)();
定义了一个函数型指针变量func1,它所指向的函数返回值为整型数据。函数型指针变量是专门用来存放函数入口地址的,在程序中把哪个函数的地址赋给它,它就指向那个函数。程序中可以对一个函数型指针多次赋值,该指针可以先后指向不同的函数。
给函数型指针赋值的一般形式为:
函数型指针变量名=函数名
如果有一个函数max(x,y),可用如下赋值语句将该函数的地址赋给函数型指针func1,使func1指向函数max(x,y):
func1=max;
引入函数型指针后,对于函数的调用可以采用两种方法。例如,程序中要求将函数max(x,y)的值赋给变量z,可采用如下方法:
z=max(x,y);或z=(*func1)(x,y);
这两种方法实现函数调用的结果是完全一样的。但需要注意的是,若采用函数型指针来调用函数,必须先对该函数指针进行赋值,使之指向所需调用的函数。
函数型指针通常用来将一个函数的地址作为参数传递到另一个函数中去。这种方法对于要调用某个非固定函数的场合特别适用。下面通过一个例子来说明函数型指针的这种应用。
例2-47 函数型指针作为函数的参数。
设置一个函数process(),每次调用它时完成不同的功能。输入两个整型数a和b,第一次调用时找出a和b中较大者,第二次调用时找出较小者,第三次调用时求出a与b的和。
程序执行结果:
本例中三个函数max()、min()和add()分别用来实现求较大数、求较小数和求和的功能。在主函数main()中第一次调用process()函数时,除了将a和b作为实参传递给process()的形参x、y之外,还将函数名max作为实参(入口地址)传递给process()的形参——指向函数的指针变量*f。这样一来,process()中的函数调用语句 result=f();就相当于result=max(x,y);执行process()函数即可求出a与b中的较大者。第二次调用process()函数时改用函数名min作为实参,第三次调用process()函数时改用函数名add作为实参,从而实现每次调用process()函数时完成不同的功能。