関数へのポインタ

今日関数へのポインタを作ろうと思ったら度忘れしたのでめも。


基本形: 戻り値の型 (*名前) (引数);

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章 シノニムの定義 -