2012-06-06 68 views
8

我很难理解下面的声明是什么意思。这个声明是否为标准?double *(* p [3])(void *(*)());意思?

double* (*p[3]) (void* (*)()); 

任何人都可以帮助我理解这个声明的含义吗?

+1

我很高兴地走在Java世界......而不是在C世界运行 –

+7

...? ;-) –

+0

Oli Charlesworth提供了一个非常有用的答案。不要关闭。 – DevSolar

回答

9

规则用于读取多毛的声明:找到最左边的标识符和向外工作,记住()[]*之前绑定,所以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}; 

每个foobarbletch会调用该函数传递给它,不知何故返回一个指针double

你也想定义满足参数类型为每个foobar一个或多个功能,和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 **相同。

+0

非常感谢! – Nick

10

只需使用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]; 

(显然,代替foobar使用适当的名字!)

+2

我从来没有见过那个网站+1 –

+0

请注意,您也可以将'cdecl'作为命令行工具。 –

+1

+1用于连接你的智慧源,而不是让它看起来像你自己变出它。 ;-) – DevSolar

2

p阵列的3个指针一个函数返回一个double指针,并将一个指针指向另一个返回void指针并且不带参数的函数。

但是,不使用此语法,请尝试使用typedef代替。

+0

+1,因为对我来说这是最明确的描述 – Nick

+0

我也是,但我喜欢Oli的链接“谚语教我鱼”:) –

1

它是函数指针的数组(大小为3),它返回指向double的指针并将另一个函数指针作为参数。

类型的函数,它的指针可以被存储在数组中:double *(func)(void* (*)())
,其指针可以作为参数被传递给FUNC类型功能:void *(func1)(void)

+0

+1因为这是最容易理解的描述(对我而言)。 – ArjunShankar

相关问题