我很难理解下面的声明是什么意思。这个声明是否为标准?double *(* p [3])(void *(*)());意思?
double* (*p[3]) (void* (*)());
任何人都可以帮助我理解这个声明的含义吗?
我很难理解下面的声明是什么意思。这个声明是否为标准?double *(* p [3])(void *(*)());意思?
double* (*p[3]) (void* (*)());
任何人都可以帮助我理解这个声明的含义吗?
规则用于读取多毛的声明:找到最左边的标识符和向外工作,记住()
和[]
*
之前绑定,所以T *a[N]
是一个指针到T
阵列,T (*a)[N]
是指向的T
阵列,T *f()
是返回指针到T
的功能,并且T (*f)()
是指向返回T的函数的指针。由于函数原型可能会省略参数名称,因此您可能会看到诸如T *[N]
或T (*)()
之类的内容。意思是大致相同,只是假装有一个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);
通话
T a[]
和T a[N]
与T *a
相同;在所有三种情况下,a
是指向T
的指针,而不是数组T
。请注意,这是只有在函数参数声明中为true。因此,T *[]
将与T **
相同。
非常感谢! – Nick
只需使用http://cdecl.org:
声明数p作为指针的阵列3到函数(函数指针返回指向void)返回指针加倍
有关详情,请参阅本MSDN文章:Interpreting more complex declarators。
但类型定义,将有助于:
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
使用适当的名字!)
你p
是阵列的3个指针一个函数返回一个double
指针,并将一个指针指向另一个返回void
指针并且不带参数的函数。
但是,不使用此语法,请尝试使用typedef代替。
+1,因为对我来说这是最明确的描述 – Nick
我也是,但我喜欢Oli的链接“谚语教我鱼”:) –
它是函数指针的数组(大小为3),它返回指向double的指针并将另一个函数指针作为参数。
类型的函数,它的指针可以被存储在数组中:double *(func)(void* (*)())
,其指针可以作为参数被传递给FUNC类型功能:void *(func1)(void)
+1因为这是最容易理解的描述(对我而言)。 – ArjunShankar
“有一种被称为”顺时针/螺旋法则“的技术,它可以让任何C程序员在他们的脑海中解析任何C声明!”
我很高兴地走在Java世界......而不是在C世界运行 –
...? ;-) –
Oli Charlesworth提供了一个非常有用的答案。不要关闭。 – DevSolar