どちらも無効です。
void (*a[]());
として解釈されます
a -- a
a[] -- is an array
a[]() -- of function
*a[]() -- returning pointer
void (*a[]()) -- to void.
関数型の配列を宣言することはできません。同様に、
void (*a)()[]
として解釈されます
a -- a
(*a) -- is a pointer
(*a)() -- to a function
(*a)()[] -- returning an array of unknown size
void (*a)()[] -- of void.
関数は配列タイプを返すことができず、の配列を持つことはできませんvoid
。
を返す関数へのポインタの配列を宣言する場合はvoid
、次のように作成します。
a -- a
a[N] -- is an N-element array
*a[N] -- of pointers
(*a[N])() -- to functions
void (*a[N])(); -- returning void
したがって、を返す関数へのポインタの配列としてvoid (*a[N])();
宣言します。配列内の個々の関数を次のように呼び出します。a
void
(*a[i])();
また
a[i]();
私は最初の形式が好きですが、それがもう少し雑然としていても。
したがって、関数、、、、およびのリストが与えられるとswap
、配列は次のように構築されます。add
sub
prod
void swap() {...}
void add() {...}
void sub() {...}
void prod() {...}
...
void (*a[])() = {swap, add, sub, prod};
...
(*a[0])(); // calls swap
(*a[1])(); // calls add
関数名を考えると、それらはある種の引数を取ると思います。配列内のすべての関数ポインタは同じ署名を持つ必要があることに注意してください; つまり、それらはすべて同じ戻り型、および同じ数と型の引数を持つ必要があります。
ポインターを介して関数を呼び出す場合、Cを使用すると明示的な間接参照を削除できるため、これらの関数を次のように呼び出すことができます。
a[0]();
a[1]();
しかし、視覚的にもっと雑然としているとしても、私は最初の形式を好みます。
[]
およびfunction-call()
はunaryよりも優先順位が高い*
ため、T *a[N]
へのポインタのN要素配列を宣言し、のN要素配列へのポインタを宣言し、へのポインタを返す関数を宣言し、を返す関数へのポインタを宣言することを忘れないでください。。T
T (*a)[N]
T
T *f()
T
T (*f)()
T