考虑以下C声明:
typedef char (* ( * (* ARR ) ( ) ) [8]) (int,int) ;
ARR arr;
arr
表示什么?
答案 0 :(得分:3)
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
有关详情,请参阅this naming of complex declarations using clockwise/spiral rule
答案 1 :(得分:3)
从最左边的标识符开始,然后在[]
之前记住()
和*
绑定,然后*a[]
是一个指针数组{{1}是一个指向数组的指针,(*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;
是一个指向函数的指针,该函数返回指向返回char的函数的8元素指针数组的指针。
这是一个在实践中会出现这种情况的例子:
arr
所以,最后一行
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
就个人而言,我不喜欢以这种方式做事,因为你从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);
。
答案 2 :(得分:2)
arr
是一个指向函数的指针,该函数返回指向数组的指针8指向函数的指针,该函数将2个参数作为int返回字符。你肯定需要检查这个link,它将帮助你解码这些复杂的声明。
PS:我建议不要有这么复杂的声明。将其分解为部分。