eupher さんが書きました: ↑5年前
コード:
void (*p[])( int ,int ) = { sum1, sum2, sum3 };
関数へのポインタの配列とは、もう型はバッチリですね。
sum1 が関数なら、&sum1 が「関数へのポインタ」ですから、
sum1 の代わりに &sum1 と書くこともできます
sum1 と書いてもいいのは、関数は一部の例外を除いて
常に「関数へのポインタ」に変換されるからです。
関数呼出し演算子「(実引数式の並び)」はオペランドに
「関数へのポインタ」を要求するので、
(*p[i-1])(a, b); は、p[i-1](a, b); と書くこともできます。
これらについてはちょっと前に、
関数へのポインタに書きました。
ということで、次のプログラムもちゃんと動きます。
コード:
#include <stdio.h>
int main(void)
{
(&printf)("&printf\n");
(printf)("printf\n");
(*printf)("*printf\n");
(**printf)("**printf\n");
(***printf)("***printf\n");
}
さて、void (*p[])(int, int) = { sum1, sum2, sum3 }; ですが、
これは、
コード:
void (*p[3])(int, int);
p[0] = sum1;
p[1] = sum2;
p[2] = sum3;
と同じで、配列変数 p の初期化が実行時に行われます。
static void (*p[])(int, int) = { sum1, sum2, sum3 };
と静的に変数を確保することによって、関数が何十個あっても
実行時の初期化は無くなります。