重複の可能性:
関数ポインターのポイントは何ですか?
私はこのコードを見ました
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()
。
これはコールバックの使用法の 1 つにすぎませんが、最も一般的な使用法だと思います。