【发布时间】:2012-10-27 07:21:06
【问题描述】:
我看到了这段代码
void (*foo)(int);
我明白这是指向函数的指针。
我为什么要指向另一个函数,它给了我什么?
【问题讨论】:
我看到了这段代码
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()。
这只是回调的一种用法,但我相信它是最常见的一种。
【讨论】: