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

Nic*_*ick 8 c pointers

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

double* (*p[3]) (void* (*)());
Run Code Online (Sandbox Code Playgroud)

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

Oli*_*rth 10

只需使用http://cdecl.org:

将p声明为指向函数的指针的数组3(指向函数的指针返回指向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];
Run Code Online (Sandbox Code Playgroud)

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

  • 在+1之前我从未见过那个网站 (2认同)

Joh*_*ode 10

读取毛茸茸声明的规则:找到最左边的标识符并向外工作,记住它()[]在之前绑定*,所以T *a[N]是一个指针数组T,T (*a)[N]是一个指向数组的指针T,T *f()是一个返回指针的函数T,T (*f)()是一个指向a的指针函数返回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
Run Code Online (Sandbox Code Playgroud)

在这里带走重要的是,您声明p数组...,而不是一个简单的返回....

这种野兽在实践中会是什么样子?那么,首先,您需要指向三个函数.这些函数中的每一个都接受一个参数,该参数是指向返回指向void的指针的函数的指针:

double *foo(void *(*)());
double *bar(void *(*)());
double *bletch(void *(*)());

double *(*p[3]) (void *(*)()) = {foo, bar, bletch};
Run Code Online (Sandbox Code Playgroud)

每一个foo,bar以及bletch将调用传递给它的功能,并以某种方式返回一个指针double.

你也想定义满足参数类型的每一个或多个功能foo,bar以及bletch:

void *blurga() {...}
Run Code Online (Sandbox Code Playgroud)

所以,如果你foo直接打电话,你会称之为

double *pv;
...
pv = foo(blurga);
Run Code Online (Sandbox Code Playgroud)

所以我们可以想象一下这样的电话

double *pv = (*p[0])(blurga);
Run Code Online (Sandbox Code Playgroud)


1 - 不同之处在于函数参数声明的上下文中,T a[]与... T a[N]相同T *a; 在所有三种情况下,a都是指针 T,而不是数组T.请注意,这适用于函数参数声明.因此,T *[]将是相同的T **.