int *(*table())[30];
解決策はどこにも見つかりません。 * table()とは何ですか、それは関数または配列ですか?in Cこの宣言の意味は次のとおりです。int *(* table())[30];
どういう意味ですか?
int *(*table())[30];
解決策はどこにも見つかりません。 * table()とは何ですか、それは関数または配列ですか?in Cこの宣言の意味は次のとおりです。int *(* table())[30];
どういう意味ですか?
置換可能な宣言の部分を代替名で置き換えると、そのような構文の読み込みがはるかに簡単になります。例えば、f
がtable()
であり、これは不特定多数の引数を取る関数であり、t
はint*
です。
そして宣言は以下のようになる。明らかt
の30個の要素の配列へのポインタである
t(*f)[30];
。
f
を交換し、そして我々は、引数の不特定多数を取って、そしてトンの30個の要素の配列へのポインタを返す関数を得る:t
を交換し
t(*table())[30];
と、私たちは、引数の不特定多数を取る機能を取得、およびintにポインタの30個の要素の配列へのポインタを返す:
int*(*table())[30];
あなたが内側からこれを復号することができる:
int *(*table())[30];
最も内側のバインディングは、指定されていない引数を持つ関数であるtable()
です。次のレベルは*table()
なので、table
は何かへのポインタを返しています。次のレベルは(*table())[30]
なので、何かの長さの配列にポインタを戻しています。次のレベルは*(table())[30]
なので、何かへのポインタの30の長さの配列へのポインタを返します。最終レベルでは、型指定子int *(*table())[30]
が追加されます。
したがってtable
は、int
へのポインタの30の長さの配列へのポインタを返す関数です(指定されていません)。
intのポインタの配列の30番目の場所に移動するか、長さ30の配列のポインタ? –
@DeBanana宣言子なので、30はインデックスではなく配列の長さです。 –
ライン:
int *(*table())[30];
「は表はintへのポインタ30のアレイへのポインタを返す関数である。」ことを宣言します
C型宣言の読み方については、無数の良い記事があります。
ルール:
。 $ typenameを呼び出します。
[]
と()
と*
で囲まれた識別子があります。その$識別子を呼び出します。あなたの宣言は、$identifier
は... $typename
のようにテンプレート化されます。
"$ identifier is a(n)"で始まります。
あなたの宣言にそれを追加し、[...]
または(...)
を消費することによって、右に行くことができます。 [...]
は(おそらく空の)配列宣言であり、 "array of of ..."と書かれている。 (...)
は(おそらく空の)関数宣言であり、 "関数を返す"または "関数を取る(...)返す"と書かれている。
セミコロン、カンマ、または閉じ括弧に達すると右に行くことができない場合は、左に移動する必要があります。プロセスの最後にある場合は$ typenameを消費するか、ポインタ宣言(*
、 "pointer to s")が書かれているか、またはかっこが消えています。 $ typenameを除いて、これらのどれかを消費した後、もう一度右に行ってみてください。
覚えておくこと:可能であれば、必要に応じて左に移動します。
int *(*table())[30];
ステップ:
あなたの質問は、のは、もう一度見てみましょう、このことを念頭に置いて
を再訪しました
${typename} *(*${declaration}())[30];
ゴー "の表は、(n)が"::失敗し、右${typename} *(* ${declaration})[30];
スタートなぜなら)
${typename} * ${declaration} [30];
${typename} * ${declaration};
;
0123の失敗します、${typename} ${declaration}
書き込みをその順序ですべての、そしてあなたが得る:
表は30ポインタの配列へ(N)を返す関数ポインタ(S)です(
:必要としない場合)、S(除去することにより、文をクリーンアップし、 "ポインタ" との単一のポインタを交換をintへの)
テーブルは、intへの30個のポインタの配列へのポインタを返す関数です。
上記の宣言は、時計回り/螺旋のルールで理解できます。
以下のルールを使用して宣言を解析する方法について説明:
1)テーブルは、不特定の引数を持つ関数です。
2)テーブル()関数はポインタを返します。
3)要素のアレイにテーブル()ファンクションポイントによって返さポインタ。
4)各要素は、タイプの整数ポインタです。つまり、各要素は整数を指しています。ルール約
よりも、このリンクで説明されている:The ``Clockwise/Spiral Rule''
識別子テーブル 30個の整数ポインタの配列へのポインタを返す関数です。いわゆるclockwise/spiral ruleの学習の補完として、http://cdecl.org/のようなサイトを使用して見つけることができます。
コードを書き直すことができた場合、宣言を型宣言と関数宣言に分割します。そうすれば、プログラムテキストを理解しやすくなります。また、私は結果の型をテーブルと呼び、より具体的なテーブル、例えばFooテーブルを返す関数のより具体的な名前を選択します。可能であれば、私はまた、空のパラメータ・リストを避け、機能がパラメータ取らないことを指定するキーワード無効を使用します:
typedef int *(*Table)[30];
Table FooTable(void);
を(HTTP [intへのポインタの配列30へのポインタを返す関数としてテーブルを宣言する] //cdecl.ridiculousfish.com?q=int+*(*table())[30]%3B) – ckruczek
cdeclはあなたの友人です。' 'intへのポインタの配列30へのポインタを返す関数としてテーブルを宣言する – hobbs
スパイラル/時計回りのルールhttp://c-faq.com/を参照してください。 decl/spiral.anderson.html –