他们都是无效的。
void (*a[]());
被解释为
a -- a
a[] -- is an array
a[]() -- of function
*a[]() -- returning pointer
void (*a[]()) -- to void.
您不能声明函数类型的数组。相似地,
void (*a)()[]
被解释为
a -- a
(*a) -- is a pointer
(*a)() -- to a function
(*a)()[] -- returning an array of unknown size
void (*a)()[] -- of void.
函数不能返回数组类型,也不能有void
.
如果要声明一个指向返回函数的指针数组void
,可以将其构建为:
a -- a
a[N] -- is an N-element array
*a[N] -- of pointers
(*a[N])() -- to functions
void (*a[N])(); -- returning void
因此,void (*a[N])();
声明a
为一个指向返回函数的指针数组void
。您将数组中的每个单独函数称为
(*a[i])();
或者
a[i]();
虽然我更喜欢第一种形式,即使它有点混乱。
因此,给定函数swap
、add
、sub
和的列表prod
,您可以将数组构建为
void swap() {...}
void add() {...}
void sub() {...}
void prod() {...}
...
void (*a[])() = {swap, add, sub, prod};
...
(*a[0])(); // calls swap
(*a[1])(); // calls add
给定函数名称,我假设它们采用某种参数。请注意,数组中的所有函数指针都应具有相同的签名;也就是说,它们都应该具有相同的返回类型,以及相同数量和类型的参数。
当您通过指针调用函数时,C 允许您删除显式取消引用,因此您可以将这些函数称为
a[0]();
a[1]();
但我更喜欢第一种形式,即使它在视觉上更混乱。
请记住,[]
函数调用()
的优先级高于一元*
,因此T *a[N]
声明指向 的 N 元素数组,声明指向 的 N 元素数组的指针,声明T
返回指向的指针的函数,并声明指向返回的函数的指针.T (*a)[N]
T
T *f()
T
T (*f)()
T