2

Cのこれら2つの関数ポインタ表記の違いは何ですか?

void (*a[]())void (*a)()[]

それらは両方とも同じものを表しますか(関数へのポインターの配列として)、または2番目のものは関数の配列へのポインターを表しますか?

これらの関数をどのように呼び出す必要がありますvoid (*a[]()) = {swap, add, sub, prod};か?

これは、a4つの要素の関数ポインタの配列であり、、、、swapaddアドレスが...にあることを意味しますか。このように、これらの関数をどのように呼び出す必要がありますか?subproda[0]a[3]

*a[i]()

またはこのように?

a[i]()
4

4 に答える 4

6

考えなくてもできるようになるまで、cdecl.orgを使用してこの問題を解決してください。

void (*a[]()): void へのポインタを返す関数の配列として a を宣言します

一方

void (*a)()[]: void の配列を返す関数へのポインタとして a を宣言します

後者は無効 C です。

于 2012-05-20T06:39:30.873 に答える
5

どちらも無効です。

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])();宣言します。配列内の個々の関数を次のように呼び出します。avoid

(*a[i])();

また

a[i]();

私は最初の形式が好きですが、それがもう少し雑然としていても。

したがって、関数、、、、およびのリストが与えられるとswap、配列は次のように構築されます。addsubprod

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要素配列へのポインタを宣言し、へのポインタを返す関数を宣言し、を返す関数へのポインタを宣言することを忘れないでください。。TT (*a)[N]TT *f()TT (*f)()T

于 2012-05-20T13:31:47.067 に答える
4

CのRight-Left-Rule (ここでの他の参照)によると、両方の式はコンパイラーによって(そしておそらく標準によっても)無効であると見なされます。

前者は関数の配列であり、後者はボイドの配列です。

voidを返す関数へのポインタの配列は次のようになります

void (*a[])()

于 2012-05-20T06:39:16.947 に答える
0

The second expression is not valid in C, since first it doesn't allow for arrays of void and second it doesn't allow a function to return an array.

于 2012-05-20T06:39:47.710 に答える