由于指针可以指向任何内存位置中的地址,它们也可以指向可执行代码的开头。
指向函数或函数指针的指针指向内存中函数的可执行代码。函数指针可以存储在数组中,也可以作为参数传递给其他函数。
函数指针声明使用*就像使用任何指针一样:
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)等语句是正确的,但在函数赋值和函数调用中不必包含地址运算符和间接运算符*。