2011-12-05 3 views
0

を定義するときにこれが問題である右から左へのルールを複雑charに渡して7つの要素の配列へのポインタを返します。各要素は struct Sporcleへのポインタです。は変数

私の答え:

*((Sporcle*)[7]) (*fubar)(char*);

誰もが私の答えを検証および/または(しゃれが意図していない)私にいくつかのポインタを与えることはできますか?

編集回答:

((struct Sporcle*)[7]) *(*fubar)(char*);

最終的な答え

struct Sporcle *(*(*fubar)(char *))[7];

+2

あなたは一番左の '*'が必要ではないと思いますか? –

+0

書き留めてみてください:7要素の配列へのポインタ。各要素は、構造体Sporcleへのポインタです。 – Beginner

+0

私は "配列へのポインタを返します..."によって捨てられました。したがって、戻り値自体がポインタでなければならず、そのポインタは7つのSporcle *要素を指しているはずです。 – lordmarinara

答えて

11

時に作品をそれをビルドします。

fubarという名前の変数を...

fubar 
を関数へ

...それはポインタである...

*fubar 

... ...

(*fubar)() 

...それがcharへのポインタを取り...

(*fubar)(char *) 

...ポインタを返す...

*(*fubar)(char *) 

...アレイには7要素の...

(*(*fubar)(char *))[7] 

...各要素がポインタ...

*(*(*fubar)(char *))[7] 

... struct Sporcle

struct Sporcle *(*(*fubar)(char *))[7] 

あなたの答えが間違っています - (宣言指定と呼ばれる)、左側のもののみを直接typedefで定義されたタイプ(intのような基本型、structunionenumまたはタイプ名を指定することができますオプションで、staticのようなストレージクラス指定子および/またはconstのような型指定子で修正されています)。ポインタ、配列、関数の型は、宣言の右側(宣言子)に、*,[]または()を追加することによって構成されます。

この場合、宣言指定子はstruct Sporcleで、残りは宣言子です。

+0

+1(私はもう一度投票できる...) – Beginner

+0

うわー、大丈夫、それですべてがとても明確になります。本当にありがとう! – lordmarinara

+0

@lordmarinara:このメソッドに従うと、覚えておいてほしいのは、宣言者に '[]'や '()'を適用し、最後に '*'を適用すると、最初に既存の宣言子のまわりにかっこを追加します。(これは、関数の配列や関数を返す関数を持つことができないため、最初の識別子以外に '()'を追加する場合は常に*です。関数ポインタの配列または関数ポインタを返す関数のみ) 。 – caf

3

cdecl(1)はあなたの友達です:

cdecl> declare fubar as pointer to function(pointer to char) returning pointer to array 7 of pointer to struct Sporcle 
struct Sporcle *(*(*fubar)(char *))[7] 
+0

7個のポインタではなく、7個の要素の配列へのポインタを返すので、 '[7]'を最初の括弧の中に入れる必要がありますか?または私はそれを間違って読んでいますか? – lordmarinara

+0

@ordmarinara - 'declare'行は意味がありますか?それが正しいとすれば、出力は正しいです...私はあなたが尋ねている区別を得るのか分からない。 –

+0

私たちはここで誰かがトピックを理解するのを助けようとしており、完全なソリューションを投稿しています............... – Beginner

3

私は妥当性についてコメントしませんが、私はポインタを提供します:しないでください。これは純粋に知的な運動である場合を除き、パズルのそれはより少なくするために宣言をリファクタリング:

typedef Sporcle SevenSporcles[7]; 
SevenSporcles* (*fubar)(char*);