我无法理解以下声明的含义。这个声明是标准吗?
double* (*p[3]) (void* (*)());
有谁能帮我理解这个宣言的含义?
答案 0 :(得分:10)
只需使用http://cdecl.org:
将p声明为指向函数的指针的数组3(指向函数的指针返回指向void的指针)返回指向double的指针
有关详细信息,请参阅此MSDN文章:Interpreting more complex declarators。
但是typedef会有所帮助:
typedef void *(*foo)(); // foo is a function-pointer type
typedef double *(*bar)(foo); // bar is also a function-pointer type
bar p[3];
(显然,使用适当的名称代替foo
和bar
!)
答案 1 :(得分:10)
读取毛茸茸的声明的规则:找到最左边的标识符并向外工作,记住()
之前[]
和*
绑定,所以T *a[N]
是一个指针数组T
,T (*a)[N]
是指向T
数组的指针,T *f()
是一个返回指向T
的指针的函数,而T (*f)()
是一个指向返回T的函数的指针。由于函数原型可能省略参数名称,因此您可能会看到T *[N]
或T (*)()
之类的内容。意思大致相同 1 ,只是假装有一个0长度的标识符。
因此,
p -- p
p[3] -- is a 3-element array
*p[3] -- of pointers
(*p[3]) ( ) -- to functions
(*p[3]) ( (*)()) -- taking a pointer to a function
(*p[3]) ( * (*)()) -- returning a pointer
(*p[3]) (void* (*)()) -- to void
* (*p[3]) (void* (*)()) -- returning a pointer
double* (*p[3]) (void* (*)()); -- to double
此处需要注意的重要一点是,您要将p
声明为...
的数组,而不是返回...
的函数。
这种野兽在实践中会是什么样子?那么,首先,您需要指向三个函数。这些函数中的每一个都接受一个参数,该参数是指向返回指向void的函数的函数的指针:
double *foo(void *(*)());
double *bar(void *(*)());
double *bletch(void *(*)());
double *(*p[3]) (void *(*)()) = {foo, bar, bletch};
foo
,bar
和bletch
中的每一个都会调用传递给它的函数,并以某种方式返回指向double
的指针。
您还需要为foo
,bar
和bletch
中的每一个定义一个或多个满足参数类型的函数:
void *blurga() {...}
所以,如果您直接致电foo
,则会将其称为
double *pv;
...
pv = foo(blurga);
所以我们可以设想像
这样的电话double *pv = (*p[0])(blurga);
<小时/> 1 - 不同之处在于,在函数参数声明的上下文中,
T a[]
和T a[N]
与T *a
相同;在所有三种情况下,a
都是指向 T
的指针,而不是T
的数组。请注意,在函数参数声明中,这只是 true。因此,T *[]
将与T **
相同。
答案 2 :(得分:2)
你的p
是一个3个指针的数组,返回一个double
指针的函数,并将指向另一个返回{{1}的函数的指针作为参数指针,不带参数。
但是,不要使用此语法,请尝试使用typedef。
答案 3 :(得分:1)
是函数指针的数组(大小为3),它返回指向double的指针并将另一个函数指针作为参数。
其指针可存储在数组中的函数类型:double *(func)(void* (*)())
函数的类型,其指针可以作为参数传递给func:void *(func1)(void)
答案 4 :(得分:0)
“有一种称为”顺时针/螺旋规则“的技术,可以让任何C程序员在头脑中解析任何C声明!”