関数へのポインタ
今日関数へのポインタを作ろうと思ったら度忘れしたのでめも。
基本形: 戻り値の型 (*名前) (引数);
例
int (*func) (int,char *); void (*func) (); double (*func) (double,void(*)(int,int));
関数名は実際は関数へのポインタなので、そのまま代入できる。
void hoge(void){ printf("hoge\n"); } void (*func) () = hoge; func();
関数へのポインタの配列は次みたいな感じ。
int (*func[]) (int,int) = {func1,func2,func3);
当然func1,func2,func3の型は全て一致してないとエラーになります。
実際のところ愚直に書いてると訳け分からなくなってしまうので、typedefを使うと見易くなります。
typedef int (*myfunc) (int,int); myfunc func[] = {func1,func2,func3};
ところで、typedefって普通は構造体とかでよく使いますが、
typedef 型名 識別子
みたいに使いますよね。なんで typdef int(*myfunc) (int,int); でint の引数を二つ受け取って戻り値がint型の関数へのポインタの宣言になるのかなーと思いましたが、
typedef int INT2[2];
みたいなこともできるんですね。要素がint型で要素数2の配列の型になります。つまり、
/* int x[2] = {1,2} と同じ */ INT2 x = {1,2};
みたいに使えます。ていうかそもそも、
typedef int seisu; seisu b;
って普通に 1行目のseisu の部分を b で置き換えたもの、つまり
int b;
に等しいですよね。そう考えてみると
int max(int a,int b){ return a > b ? a : b; } typdef int(*myfunc) (int,int); myfunc func = max;
とできるのも全然不思議じゃないですね。
#defineみたいにコンパイル時に書き換えられてるのかなーと思いましたが、単純にそうではないようです。 > ロベールのC++教室 - 第1章 シノニムの定義 -