读取多毛声明的规则:找到最左边的标识符并向外工作,记住()和[]在*之前绑定,所以T *a[N]是一个指向T的指针数组,T (*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};
foo、bar 和 bletch 中的每一个都会调用传递给它的函数并以某种方式返回指向 double 的指针。
您还想为foo、bar 和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 的数组。请注意,这仅在函数参数声明中为真。因此,T *[] 将等同于 T **。