Professordeng's Blog

如果在程序中定义了一个函数,那么在编译时系统就会为这个函数代码分配一段存储空间,这段存储空间的首地址称为这个函数的地址。而且函数名表示的就是这个地址。既然是地址我们就可以定义一个指针变量来指向该地址,这个指针变量就叫作函数指针变量,简称函数指针(function pointer)。

同样是指向一个地址,但 ”指向函数的指针“ 和 “指向变量的指针” 的定义方式是不同的。例如:

void (*fcn)(void*);

这个语句定义了一个指向函数的指针变量 fcn。首先它是一个指针变量,所以要有一个 *,即 (*fcn);其次前面的 void 表示这个指针变量可以指向返回类型为 void 型的函数;后面括号中的 void* 表示这个指针变量可以指向参数是 void* 型的函数。所以合起来这个语句的意思就是:定义了一个指针变量 fcn,该指针变量可以指向返回值类型为 void 型,且有一个 void* 型参数的函数。

所以函数指针的定义方式为:

函数返回值类型(*指针变量名)(函数参数列表)

“函数返回值类型” 表示该指针变量可以指向具有什么返回值类型的函数;“函数参数列表” 表示该指针变量可以指向具有什么参数列表的函数。参数列表只需写参数类型即可。

观察可发现,函数指针的定义就是将 “函数声明” 中的 “函数名” 改成 (*指针变量名)。但是这里需要注意的是:(*指针变量名) 两端的括号不能省略,括号改变了运算符的优先级。如果省略了括号,就不是定义函数指针而是一个函数声明了,即声明了一个返回值类型为指针型的函数。

需要注意的是,指向函数的指针变量没有 ++-- 运算。

1. 示例

一般函数指针的调用过程如下:

void fcn(void* arg);  // 声明一个函数
int (*p)(void*);      // 定义一个函数指针
p = fcn;              // 函数指针 p 指向 fcn 函数入口

fcn 符号就是代表函数的入口。

样例在 func_ptr.c 中。