0

以下のC宣言を検討してください。

typedef char (* ( * (* ARR ) ( ) ) [8]) (int,int) ;    
ARR arr;

arrを意味しますか?

4

3 に答える 3

3

左端の識別子から始めて、それを覚えて前[]()バインドします*。これ*a[]は、ポインターの配列であり、配列へのポインターで(*a)[]あり、ポインターを*f()返す関数であり、関数(*f)()へのポインターです。

typedef                ARR                           -- ARR is a typedef for
                    (* ARR )                         -- a pointer
                    (* ARR ) ( )                     -- to a function
                ( * (* ARR ) ( ) )                   -- returning a pointer
                ( * (* ARR ) ( ) ) [8]               -- to an 8-element array
             (* ( * (* ARR ) ( ) ) [8])              -- of pointers
             (* ( * (* ARR ) ( ) ) [8]) (       )    -- to functions
             (* ( * (* ARR ) ( ) ) [8]) (int,int)    --   taking two int parameters
typedef char (* ( * (* ARR ) ( ) ) [8]) (int,int) ;  --   and returning char

それで

ARR arr;

arrcharを返す関数へのポインタの8要素配列へのポインタを返す関数へのポインタであることを 宣言します。

これが実際にどのように見えるかの例を次に示します。

char f0(int a, int b) { ... }
char f1(int x, int y) { ... }
char f2(int g, int h) { ... }
...
char f7(int r, int s) { ... }

// funcArr is an *array* of pointers to functions, not a function
char (*funcArr[8])(int, int) = {f0, f1, f2, f3, ..., f7}; 

// func is a function that will return the funcArr array
char (*(*func())[8])(int,int) { return funcArr; }

arr = func;

char c = (*(*(*arr)())[i])(x,y);

だから、最後の行

  1. 間接参照arr
  2. 結果の関数を呼び出します(func
  3. から返されたポインタを逆参照しますfunc。これにより、配列(funcArr)が得られます。
  4. インデックスで関数ポインタを検索しますi
  5. そのポインタを逆参照して、...の1つを提供しますf0f7
  6. 結果の関数を呼び出します

typedefもう少し読みやすくする1つの方法は、段階的に行うことです。

typedef char CharFunc(int, int);
typedef CharFunc *CharFuncArray[8];
typedef CharFuncArray *ArrayFunc();

ArrayFunc *arr;

個人的には、この方法で物事を行うのは好きではありませんArrayFunc *arr

char c = (*(*(*arr)())[i])(x,y);

一方、のような宣言

char (*(*(*arr)())[8])(int,int);

使用方法を正確に示しますarr

于 2012-11-29T12:49:12.487 に答える
3

arrpointer to a function returning pointer to an array of 8 pointers to a function which takes 2 int as an argument returning char

詳細については、時計回り/スパイラルルールを使用した複雑な宣言のこの命名を参照してください

于 2012-11-29T11:49:11.107 に答える
2

arrは、配列へのポインタを返す関数へのポインタです。文字を返すintとして2つのパラメータを受け取る関数への8つのポインタです。このような複雑な宣言をデコードするのに役立つこのリンクを必ず確認する必要があります。

PS:そのような複雑な宣言はしないことをお勧めします。それをいくつかの部分に分割します。

于 2012-11-29T11:51:45.317 に答える