我很难理解以下声明的含义。这个声明是否是标准的?
double* (*p[3]) (void* (*)());
有人能帮我理解这个声明的含义吗?
我很难理解以下声明的含义。这个声明是否是标准的?
double* (*p[3]) (void* (*)());
有人能帮我理解这个声明的含义吗?
只需使用http://cdecl.org:
声明 p 为指向返回指针的函数指针数组,该指针指向返回指向void类型指针的函数并返回指向double类型的指针。
有关更多信息,请参阅此 MSDN 文章:解释更复杂的声明符。
但是,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
!)
阅读复杂声明的规则:找到最左边的标识符并向外扩展,记住()
和[]
比*
优先级更高,因此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
声明为一个由...
组成的数组,而不是一个返回 ...
的函数。
实际上这样的代码会是什么样子呢?首先,你需要三个函数指针。每个函数都接受一个参数,该参数是指向返回指针的函数的指针。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);
T a[]
和 T a[N]
与 T *a
是相同的;在这三种情况下,a
是 T
的指针,而不是 T
的数组。请注意,这仅适用于函数参数声明。因此,T *[]
将与 T **
相同。
p
是一个指向返回double
指针的函数的3个指针数组,并且接受另一个返回void
指针且不带参数的函数的指针作为参数。
但是,不要使用这种语法,尝试使用typedef代替。
这是一个大小为3的函数指针数组,返回指向double类型的指针,并以另一个函数指针作为参数。
可以存储在该数组中的函数指针类型为:double *(func)(void* (*)())
可以作为func参数传递的函数指针类型为:void *(func1)(void)
有一种技巧被称为“顺时针/螺旋规则”,它使得任何C程序员都能够在脑海中解析任何C声明!