#include <stdio.h>
typedef int Myfunc(int);
Myfunc型の名前です。intこれは、引数を取り、 を返す関数intです。
typedef int (*point_to_myfunc)(int);
point_to_myfuncint引数を取り、 を返す関数へのポインタintです。必要に応じて、次のこともできtypedef Myfunc *ptr_to_myfunc;ます (同じタイプの別の名前)。
static Myfunc example;
exampleこれは、「タイプの呼び出された関数が存在する」ことを示していMyfuncます。
static int example(int a)
{
printf("example a=%d\n", a);
return 1;
}
これは の可能な実装ですexample。Myfuncその型の関数の定義でtypedef 名を like に使用することはできません。
static void example2(Myfunc *f)
{
printf("example2\n");
f(2);
}
これは、へのポインターを受け取る関数ですMyfunc。この行f(2);は、引数 2 で指定された関数を呼び出し、戻り値を無視します。
static void example3(int (*)(int));
これは、引数を取り結果を返すexample3関数へのポインタを取る関数として宣言します。またはまたはと書かれている可能性があります。intintstatic void example3(point_to_myfunc);static void example3(ptr_to_myfunc);static void example3(Myfunc *);
static void example3(int (*point_to_Myfunc)(int))
{
printf("example3\n");
point_to_Myfunc(3);
}
これは の実装ですexample3。
int main(void)
{
point_to_myfunc f = &example;
example2(f);
example3(f);
return 0;
}
このプログラムにはf、関数へのポインターである変数があります。興味深いことに、次のことができます。
point_to_myfunc f2 = example;
point_to_myfunc f3 = *example;
などなど、すべて同じ意味です。
以下を使用してそれらを呼び出すこともできます。
(*f2)(101);
(**f3)(103);
初期化の標準表記では、 も も使用しませ&ん*。古い学校の C プログラマーなら、(*f2)(101)表記法を使用して関数ポインターを呼び出すことができます。C89 標準より前では、それが関数ポインターを呼び出す唯一の方法でした。f2(101);モダンなスタイルは代わりになりがちです。