(*f)()
関数型については,次の文法があります。
sizeof
演算子とアドレス演算子を除く式では,T
型を返却する関数(function returning type T
)は,T
型を返却する関数へのポインタに変換される。[C99, 6.3.2.1, 4]
この文法は,配列と同様に,特別に用意されたものです。(アドレス演算子を使用せずともアドレスを取得できるのは,配列と関数のみである。)例えば,
double f(char, int);
があったとき,関数指示子(式)f
は関数 f
のアドレスとなります。
関数のアドレスを受け取ることのできるポインタが「関数へのポインタ」です。例えば,上の関数 f
のアドレスを受け取るには,
double (*pf)();
といった具合に宣言したポインタ pf
になります。これは double
を返す関数へのポインタです。
/* Example 10.18 */ #include <stdio.h> void f(void); int main(void) { void (*pf)(void) = f; pf(); return 0; } void f(void) { printf("Hello World!\n"); }
実行結果です。
Hello World!
pf
が void
型関数へのポインタです。それを f
に初期化しています。関数呼出しは pf()
ですが,これは f()
と同値です。すなわち,pf == f
です。