関数ポインタについて

これと言って語れるようなことがなかったので、専門の時に習った関数ポインタについて話そうと思います。

 

C言語での話になりますが、他の言語でも応用できたりするのかなと少し考えてみたりしています。

 

*そもそも関数ポインタとは

関数をアドレスで持って変数にしまってしまおう、というもの。

そのままですね。 



// プロトタイプ宣言
void hoge(void);

int main() {
    void (*p)() = hoge;
    p();
    return 0;
}

void hoge() {
    printf("hoge 呼ばれた。");
}

久々にCを触ったせいで何度もセミコロンを忘れてコンパイラーにとても怒られました

つまり、変数にぶちこめるということは、配列にぶちこむこともできるということ。



// プロトタイプ宣言
void hoge1(void);
void hoge2(void);

typedef void (*p)();
p piyo[] = {hoge1, hoge2};

int main() {
        piyo[0]();
        piyo[1]();
        return 0;
}

void hoge1() {
        printf("hoge1 呼ばれた。\n");
}
void hoge2() {
        printf("hoge2 呼ばれた。\n");
}

わざわざtypedefする必要もなかったような…気もしますが…

今は頭が回ってないのでとりあえずはこれで…

 

配列に入れて何の利点があるんだという話ですね。

switch文で呼ぶメソッドが変わる、なんていう時に使えば、switchより若干早く呼べます。

思い浮かぶ利点はこれくらいでしょうか…

 

ポインタを使う言語をあまり知らないなんとも言えませんが、どこかで応用できたらいいなと思います。