一、声明
一个函数在编译时被分配一个入口地址。这个入口地址就成为函数的指针。像其他函数一样,函数指针也指向某个特定的类型。函数类型尤其返回类型以及形参表确定,与函数名无关。
int (*p) (int, int);
这个语句将p声明为指向函数的指针变量,该函数会有两个整型参数,返回值为整型。 *p两侧的括号是必需的,表示p先与*结合,是指针变量,然后再与后面的()结合,表示此指针指向函数,如果写成 int *p (int, int);这就声明成一个p函数了,该函数返回一个指向int型的指针。
另外,可以使用typedef来简化声明:
typedef int *pFunc (int, int);
表示pFunc是一种指向函数的指针类型。
二、初始化和赋值
在给函数指针变量赋值时,只需给出函数名而不必给出参数,例如:
p=max;
将函数的入口地址赋给p,而不涉及实参与形参的问题。
函数指针只能通过同类型的函数或函数指针或0值常量表达式进行初始化或赋值。不同类型的指针之间不存在转换。
三、调用
#include<stdio.h> typedef int (*pFunc) (int, int); int max(int a, int b) { return a>b?a:b; } void main() { int a=3,b=5; pFunc p; p=max; int c = p(a, b); //int c = (*p)(a, b); //int c = max(a, b); printf("%d",c); }
四、将函数指针用作形参
函数指针变量通常的用途之一是吧指针作为参数传递到其他函数。有两种方法可以声明:
void sub (int (int, int), int (int, int)); void sub (int (*)(int, int), int (*)(int, int));
//可以这么定义: void sub(int (*x1)(int), int (*x2)(int, int)) { int a,b,i,j; a = (*x1)(i); b = (*x2)(i,j); ...... }
当然,如果sub函数仅仅只会用到f1,f2函数则完全不必要这样。但是如果在每次调用sub函数时,要调用的函数不是固定的,这次调用f1和f2,侧下次可能要调用f3和f4。此时用指针变量来传递函数就方便多了。只要在每次调用sub函数给出不同的函数名作为实参即可。