2016-05-11 12 views
4
int *(*table())[30]; 

解決策はどこにも見つかりません。 * table()とは何ですか、それは関数または配列ですか?in Cこの宣言の意味は次のとおりです。int *(* table())[30];

どういう意味ですか?

+1

を(HTTP [intへのポインタの配列30へのポインタを返す関数としてテーブルを宣言する] //cdecl.ridiculousfish.com?q=int+*(*table())[30]%3B) – ckruczek

+3

cdeclはあなたの友人です。' 'intへのポインタの配列30へのポインタを返す関数としてテーブルを宣言する – hobbs

+1

スパイラル/時計回りのルールhttp://c-faq.com/を参照してください。 decl/spiral.anderson.html –

答えて

3

置換可能な宣言の部分を代替名で置き換えると、そのような構文の読み込みがはるかに簡単になります。例えば、ftable()であり、これは不特定多数の引数を取る関数であり、tint*です。

そして宣言は以下のようになる。明らかtの30個の要素の配列へのポインタである

t(*f)[30]; 

fを交換し、そして我々は、引数の不特定多数を取って、そしてトンの30個の要素の配列へのポインタを返す関数を得る:tを交換し

t(*table())[30]; 

と、私たちは、引数の不特定多数を取る機能を取得、およびintにポインタの30個の要素の配列へのポインタを返す:

int*(*table())[30]; 
5

あなたが内側からこれを復号することができる:

int *(*table())[30]; 

最も内側のバインディングは、指定されていない引数を持つ関数であるtable()です。次のレベルは*table()なので、tableは何かへのポインタを返しています。次のレベルは(*table())[30]なので、何かの長さの配列にポインタを戻しています。次のレベルは*(table())[30]なので、何かへのポインタの30の長さの配列へのポインタを返します。最終レベルでは、型指定子int *(*table())[30]が追加されます。

したがってtableは、intへのポインタの30の長さの配列へのポインタを返す関数です(指定されていません)。

+0

intのポインタの配列の30番目の場所に移動するか、長さ30の配列のポインタ? –

+0

@DeBanana宣言子なので、30はインデックスではなく配列の長さです。 –

0

ライン:

int *(*table())[30]; 

「は表はintへのポインタ30のアレイへのポインタを返す関数である。」ことを宣言します

C型宣言の読み方については、無数の良い記事があります。

ルール:

  1. をタイプ名が左側にあります要約するとHere is one of them.

    。 $ typenameを呼び出します。

  2. 右側には、[]()*で囲まれた識別子があります。その$識別子を呼び出します。

あなたの宣言は、$identifierは... $typenameのようにテンプレート化されます。

  1. "$ identifier is a(n)"で始まります。

  2. あなたの宣言にそれを追加し、[...]または(...)を消費することによって、右に行くことができます。 [...]は(おそらく空の)配列宣言であり、 "array of of ..."と書かれている。 (...)は(おそらく空の)関数宣言であり、 "関数を返す"または "関数を取る(...)返す"と書かれている。

  3. セミコロン、カンマ、または閉じ括弧に達すると右に行くことができない場合は、左に移動する必要があります。プロセスの最後にある場合は$ typenameを消費するか、ポインタ宣言(*、 "pointer to s")が書かれているか、またはかっこが消えています。 $ typenameを除いて、これらのどれかを消費した後、もう一度右に行ってみてください。

    覚えておくこと:可能であれば、必要に応じて左に移動します。

    1. $型名= "INT"
    2. :ステップバイ

      int *(*table())[30]; 
      

      ステップ:

    あなたの質問は、のは、もう一度見てみましょう、このことを念頭に置いて

    を再訪しました

  4. $ identifier = "table";右${typename} *(*${declaration}())[30];

  5. ゴー "の表は、(n)が"::失敗し、右${typename} *(* ${declaration})[30];

  6. ゴー "を返す...機能" "$識別子(n)がある" と
  7. スタートなぜなら)

  8. の移動は左: "...ポインタ(複数可)に" ${typename} * ${declaration} [30];
  9. 囲碁右:右${typename} * ${declaration};
  10. ゴー」30" の...配列:理由; 0123の失敗します、
  11. 左へ:「...ポインタへ」${typename} ${declaration}
  12. 右へ:失敗します。
  13. Goは左: "int型"

書き込みをその順序ですべての、そしてあなたが得る:

表は30ポインタの配列へ(N)を返す関数ポインタ(S)です(

:必要としない場合)、S(除去することにより、文をクリーンアップし、 "ポインタ" との単一のポインタを交換

をintへの)

テーブルは、intへの30個のポインタの配列へのポインタを返す関数です。

0

上記の宣言は、時計回り/螺旋のルールで理解できます。

enter image description here

以下のルールを使用して宣言を解析する方法について説明:

1)テーブルは、不特定の引数を持つ関数です。

2)テーブル()関数はポインタを返します。

3)要素のアレイにテーブル()ファンクションポイントによって返さポインタ

4)各要素は、タイプの整数ポインタです。つまり、各要素は整数を指しています。ルール約

よりも、このリンクで説明されている:The ``Clockwise/Spiral Rule''

0

識別子テーブル 30個の整数ポインタの配列へのポインタを返す関数です。いわゆるclockwise/spiral ruleの学習の補完として、http://cdecl.org/のようなサイトを使用して見つけることができます。

コードを書き直すことができた場合、宣言を型宣言と関数宣言に分割します。そうすれば、プログラムテキストを理解しやすくなります。また、私は結果の型をテーブルと呼び、より具体的なテーブル、例えばFooテーブルを返す関数のより具体的な名前を選択します。可能であれば、私はまた、空のパラメータ・リストを避け、機能がパラメータ取らないことを指定するキーワード無効を使用します:

typedef int *(*Table)[30]; 

Table FooTable(void); 
関連する問題