我无法理解以下声明的含义.这个声明标准吗?
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)
(显然,使用适当的名称代替foo和bar!)
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)
T a[]与... T a[N]相同T *a; 在所有三种情况下,a都是指针 T,而不是数组T.请注意,这仅适用于函数参数声明.因此,T *[]将是相同的T **.
| 归档时间: |
|
| 查看次数: |
1071 次 |
| 最近记录: |