関数ポインタ概要
関数は実行コードの開始アドレスを持っている。
このアドレスをポインタに格納することができる。
このポインタを関数ポインタという。
このポインタを使って、関数を呼び出すことができる
宣言例
int foo(int n); //int型を返す関数foo int *bar(int n); //int型へのポインタを返す関数bar int (*buzz)(int n); //int型を返す関数へのポインタbuzz /* * 2つのint型引数を持ちint型を返す関数、へのポインタ * 引数の名前は省略できる */ int (*calc)(int, int); /* * 何度も同じ関数ポインタを利用するときは、 * 予めtypedefで設定しておくと便利 */ typedef int (*Func)(int, int); Func func;
関数ポインタの使用例
#include <iostream> #include <string> using namespace std; typedef int (*Calc)(int, int); Calc calc; int add(int a, int b) { return a+b; } int sub(int a, int b) { return a-b; } int main(){ calc = add; cout << calc(30, 20) << endl; calc = sub; cout << calc(30, 20) << endl; return 0; }
クラスのメンバ関数へのポインタの表記
class MyClass{ public: int data; void func(int a); }; int MyClass::* dp; void (MyClass::* fp)(int); // typedef void (MyClass::* fp)(int);