以下のC宣言を検討してください。
typedef char (* ( * (* ARR ) ( ) ) [8]) (int,int) ;
ARR arr;
何arr
を意味しますか?
左端の識別子から始めて、それを覚えて前[]
に()
バインドします*
。これ*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;
arr
charを返す関数へのポインタの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);
だから、最後の行
arr
func
)func
。これにより、配列(funcArr
)が得られます。i
f0
。f7
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
。
arr
はpointer to a function returning pointer to an array of 8 pointers to a function which takes 2 int as an argument returning char
arr
は、配列へのポインタを返す関数へのポインタです。文字を返すintとして2つのパラメータを受け取る関数への8つのポインタです。このような複雑な宣言をデコードするのに役立つこのリンクを必ず確認する必要があります。
PS:そのような複雑な宣言はしないことをお勧めします。それをいくつかの部分に分割します。