我看到這個代碼
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()
。
這只是回調的一種用法,但我認爲這是最常見的回調。