double *(* p [3])(void *(*)());意思?

时间:2012-06-06 13:11:29

标签: c pointers

我无法理解以下声明的含义。这个声明是标准吗?

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

有谁能帮我理解这个宣言的含义?

5 个答案:

答案 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];

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

答案 1 :(得分:10)

读取毛茸茸的声明的规则:找到最左边的标识符并向外工作,记住()之前[]*绑定,所以T *a[N]是一个指针数组TT (*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};

foobarbletch中的每一个都会调用传递给它的函数,并以某种方式返回指向double的指针。

您还需要为foobarbletch中的每一个定义一个或多个满足参数类型的函数:

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声明!”

顺时针螺旋规则 - http://c-faq.com/decl/spiral.anderson.html