程序中每个函数都位于内存中的某个位置,所以存在指向那个位置的指针------函数指针。
函数指针最常用的两个地方是:转换表和作为参数传递给领一个函数。和其他的指针一样,对函数指针执行间接访问之前必须把它初始化为指向某个函数。
int f(int); int (*pf)(int) = &f;
这段代码告诉我们,创建了一个函数指针,并把它初始化为指向函数f。函数指针的初始化也可以通过一条赋值语句来完成。在函数指针初始化之前,具有f的原形是很重要的,否则编译器就无法检查f的类型是否与pf所指向的类型一致。
初始化表达式中的&操作符是可选的,因为函数名被使用时总是有编译器把它转化为函数指针。&操作符只是显式的说明了编译器将隐式执行的任务。
1 int ans; 2 ans = f(25); 3 ans = (*pf)(25); 4 ans = pf(25);
第2条语句是简单的调用函数f,但是它的执行过程确实很复杂的。函数名f首先被转换为一个函数指针,该指针指定函数在内存中的位置。然后函数调用操作符调用该函数,执行开始于这个地址代码。
第3条语句是对pf执行期间间接访问操作,他把函数指针转换为一个函数名。这个转换并不是真正需要的,因为在编译器执行函数调用操作符之前又会把它转回去。这条语句和前一条语句完全一致。
第4条语句和前两条语句效果一致。间接访问操作并非必须,因为编译器需要的是一个函数指针。