#include <stdio.h>
typedef int Myfunc(int);
Myfunc
型の名前です。int
これは、引数を取り、 を返す関数int
です。
typedef int (*point_to_myfunc)(int);
point_to_myfunc
int
引数を取り、 を返す関数へのポインタ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
関数へのポインタを取る関数として宣言します。またはまたはと書かれている可能性があります。int
int
static 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);
モダンなスタイルは代わりになりがちです。