由于指针可以指向任何内存位置中的地址,它们也可以指向可执行代码的开头。
指向函数或函数指针的指针指向内存中函数的可执行代码。函数指针可以存储在数组中,也可以作为参数传递给其他函数。
函数指针声明使用*就像使用任何指针一样:
return_type (*func_name)(parameters)
括号(*func_name)很重要。如果没有它们,编译器会认为函数返回了一个指针。
声明函数指针后,必须将其分配给函数。以下短程序声明函数,声明函数指针,将函数指针赋给函数,然后通过指针调用函数:
#include <stdio.h>
void say_hello(int num_times);
/* 函数 */
int main() {
void (*funptr)(int); /* 函数指针 */
funptr = say_hello; /* 指针分配 */
funptr(3); /*函数调用 */
return 0;
}
void say_hello(int num_times) {
int k;
for (k = 0; k < num_times; k++)
printf("Hello\n");
}
函数名指向可执行代码的开头,正如数组名指向其第一个元素一样。因此,尽管funptr=&say_hello和(*funptr)(3)等语句是正确的,但在函数赋值和函数调用中不必包含地址运算符和间接运算符*。