1

重複の可能性:
複雑な関数宣言を理解するには?
C式を解析するためのスパイラルルールと「宣言は使用法に従う」

K&R の The C Programming Languageブックには、すでに読んだことがあるかもしれないが、同じタイトルの「複雑な宣言」というセクションがある。私はちょうど本を読んで、C言語で自分自身を改善しようとしています. 上記のセクションを読んだ後、C 宣言ステートメントの構文の背後にあるロジックを取得できなかったと思います。1、2、3、および 4 はそのセクションの 5 と 6 は他のページからのものです。

  1. int (*daytab)[13] daytab: int の配列 [13] へのポインタ

  2. void (*comp)() comp: void を返す関数へのポインタ

  3. char (*(*x())[])() x: char を返す関数へのポインタの array[] へのポインタを返す関数

  4. char (*(*x[3])())[5] x: char の配列 [5] へのポインターを返す関数へのポインターの配列 [3]

  5. typedef int (*PFI)(char *, char *) int を返す (2 つの char * 引数の) 関数へのポインターの型 PFI を作成します。ここで構文はどのように機能しますか?

最後に、私の質問は次のとおりです。

  • 上記の例を使用して、複雑な宣言の考え方と読み方を説明できますか?
  • 1、3、4のようなものは実用的で必要ですか?もしそうなら、いくつかのコード例を書いてもらえますか?
4

2 に答える 2

6

先週ほど、HackerNews でThe ``Clockwise/Spiral Rule''を見ました。これは、C 宣言、特に関数ポインターについて考える良い方法です。

于 2013-01-20T16:23:59.357 に答える
2

右側の識別子とその横にある記号を見てください。

  • 識別子の場合[、識別子は配列用です。
  • 識別子の場合(、識別子は関数用です
  • 左を)見ると、*:識別子がポインタであることがわかります。
  • 右または左に何もない場合、識別子は「プレーンオールド」オブジェクトです。

詳細:

  1. int (*daytab)[13]
    daytabポインタです

  2. void (*comp)()
    compポインタです

  3. char (*(*x())[])()
    x関数です

  4. char (*(*x[3])())[5]
    x配列です

  5. typedef int (*PFI)(char *, char *)
    PFIポインタです

于 2013-01-20T16:27:40.917 に答える