関数ポインター

ま、そんなくだらない話はどうでもよく。今日は仕事が暇だったのでちまちまプログラム書いてたんだけど*1、関数ポインターは相変わらず混乱させられる。最近の高級言語ポインターなんぞ使わないから、もはやどうでもいい話なのかもしれないけど・・・

#include<stdio.h>

char * f1(int x){
     return (x == 1) ? "input 1" : "input not 1";
}
int main(void){
     char * (*fp1)(int) = f1;
     void *fp2 = f1;

     printf("%s\n", f1(1));
     printf("%s\n", (*fp1)(0));
     printf("%s\n", (*((char * (*)(int))fp2))(1));
     return 0;
}
(実行結果)
input 1
input not 1
input 1

みたいな。うーん、トリッキーだよなあ。

例えば、char型のポインター変数を定義するときは

char *p;

で、それを関数に応用して、char型のポインターを返して、int型を引数に取る関数のポインター

char * (*p)(int)

と。(*p)をfuncみたいな適当なシンボルに置き換えて考えてみると納得しやすいかも。

あとは、万能のvoidポインターとかに入れた場合は、キャストしないといけない。「char型のポインターを返して、int型を引数に取る関数のポインター型」にキャストするなら

((char * (*)(int))

という風になる、と。


・・・めんどくさー。でも関数ポインタは便利。

*1:雑用プログラムですね