カンパ〜イ!←最初の1杯目、なに頼む?

C言語の高階関数についてです。

double f ( (*g)(double) ){...} とすると「関数を引数にする関数」が作れますが、
「関数を引数にする関数」を引数にする関数って作れますか???

その場合は、引数のところどうやって書けばいいでしょうか??

A 回答 (2件)

void f(void (*g)(void (*)(double))) {...}


と書けます。
「g」が「関数を引数にする関数」で、
「f」が「関数を引数にする関数を引数にする関数」です。

一点、注意なのですが、
「関数を引数にする」というのは、関数ポインタ(4バイト)を引数にするっていうことです。
つまり、書き方は面倒だけど、動作は単にアドレスを1つ引数に渡しているだけです。
なので、「g」が呼び出す先の関数のアドレスは、他の引数なりで、渡す必要があります。

こんな感じ:
void hhh(double v) {
printf("h:%f\n", v);
}

void ggg(void (*h)(double)) {
printf("g\n");
h(9.99);
}

void fff(void (*g)(void (*)(double))) {
printf("f\n");
g(hhh);
}

void main(void) {
fff(ggg);
}
    • good
    • 1

typedef を使うといいかもよ.

    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報