可能重复:
函数指针的意义何在?
我看到了这段代码
void (*foo)(int);
我明白这是指向函数的指针。
为什么我要指向另一个函数它给了我什么?
您可以使用它来存储可以根据程序流程更改的处理函数,例如提供给qsort
.
void (*my_handler)(int);
void set_handler(void(*fn)(int)) {
my_handler = fn;
}
void do_stuff() {
// ...
my_handler(x); // using a custom handler
}
if (something) {
set_handler(my_function_1);
}
else set_handler(my_function_2);
do_stuff();
您可以为排序算法注入一个比较器。所以你可以排除一些外部的逻辑。
或者您可以使用此方法实现回调以进行某些事件处理。
函数指针通常用于回调。例如,假设一个异步函数做了一些繁重的工作,并且您希望在它完成时收到通知:
void doWork(void (*foo)(int));
当您调用该函数时,它会在自己的线程中运行,因此会立即返回。你怎么知道什么时候完成?你告诉它在完成后调用你提供的函数:
void myFoo(int n);
你把它传递给doWork()
:
doWork(myFoo);
现在doWork()
完成后,它将调用myFoo()
.
这只是回调的一种用法,但我相信它是最常见的一种。