重複の可能性:
C 宣言をどのように読みますか?
次のことがわかりません。
int * (*(*p)[2][2])(int,int);
手伝ってくれますか?
このようなものについては、デコードされたcdeclを試してください。
declare p as pointer to array 2 of array 2 of pointer to function (int, int) returning pointer to int
p -- p
*p -- is a pointer
(*p)[2] -- to a 2-element array
(*p)[2][2] -- of 2-element arrays
*(*p)[2][2] -- of pointers
(*(*p)[2][2])( ); -- to functions
(*(*p)[2][2])(int,int); -- taking 2 int parameters
* (*(*p)[2][2])(int,int); -- and returning a pointer
int * (*(*p)[2][2])(int,int); -- to int
そのような獣は実際にはどのように見えるでしょうか?
int *q(int x, int y) {...} // functions returning int *
int *r(int x, int y) {...}
int *s(int x, int y) {...}
int *t(int x, int y) {...}
...
int *(*fptr[2][2])(int,int) = {{p,q},{r,s}}; // 2x2 array of pointers to
// functions returning int *
...
int *(*(*p)[2][2])(int,int) = &fptr; // pointer to 2x2 array of pointers
// to functions returning int *
...
int *v0 = (*(*p)[0][0])(x,y); // calls q
int *v1 = (*(*p)[0][1])(x,y); // calls r
... // etc.
p を 2 行 2 列のポインターの配列へのポインターとして定義していることを確認してください ((int a, int b) をパラメーターとして取り、int へのポインターを返す関数)
この式は、関数ポインターの 2x2 配列へのポインターを定義します。C/C++ 関数ポインター (および具体的にはそれらの配列) の概要については、http://www.newty.de/fpt/fpt.html#arraysを参照してください。
特に、与えられた関数宣言
int* foo(int a, int b);
次のように、関数ポインター ptr_to_foo を定義します (そしてそれに foo のアドレスを割り当てます)。
int* (*ptr_to_foo)(int, int) = &foo;
ここで、単一の関数ポインターだけでなく、それらの配列が必要な場合 (これをサイズ 2 x 2 の 2D 配列にしましょう):
int* (*array_of_ptr_to_foo[2][2])(int, int);
array_of_ptr_to_foo[0][0] = &foo1;
array_of_ptr_to_foo[0][1] = &foo2;
/* and so on */
どうやら、それだけでは十分ではありません。関数ポインターの配列の代わりに、そのような配列へのポインターが必要です。そして、それは次のようになります。
int* (*(*p)[2][2])(int, int);
p = &array_of_ptr_to_foo;