Rau*_*ulp 2 c function-pointers
C中这两个函数指针符号有什么区别?
void (*a[]()) 和 void (*a)()[]
它们是否都表示相同 - 一个指向函数的指针数组 - 或者第二个表示指向函数数组的指针?
我该如何称呼这些功能 - 比方说void (*a[]()) = {swap, add, sub, prod};?
是否意味着a是4个元素的函数指针和数组swap,add,sub,prod的地址是存在于a[0]... a[3].我该怎么调用这些函数呢?
*a[i]()
Run Code Online (Sandbox Code Playgroud)
或者像这样?
a[i]()
Run Code Online (Sandbox Code Playgroud)
他们都无效.
void (*a[]());
Run Code Online (Sandbox Code Playgroud)
被解释为
a -- a
a[] -- is an array
a[]() -- of function
*a[]() -- returning pointer
void (*a[]()) -- to void.
Run Code Online (Sandbox Code Playgroud)
您不能声明函数类型的数组.同样的,
void (*a)()[]
Run Code Online (Sandbox Code Playgroud)
被解释为
a -- a
(*a) -- is a pointer
(*a)() -- to a function
(*a)()[] -- returning an array of unknown size
void (*a)()[] -- of void.
Run Code Online (Sandbox Code Playgroud)
函数不能返回数组类型,也不能有数组void.
如果要声明返回函数的指针数组void,可以将其构建为:
a -- a
a[N] -- is an N-element array
*a[N] -- of pointers
(*a[N])() -- to functions
void (*a[N])(); -- returning void
Run Code Online (Sandbox Code Playgroud)
因此,void (*a[N])();声明a为返回函数的指针数组void.您将数组中的每个单独函数调用为
(*a[i])();
Run Code Online (Sandbox Code Playgroud)
要么
a[i]();
Run Code Online (Sandbox Code Playgroud)
虽然我更喜欢第一种形式,即使它更混乱.
因此,考虑到功能列表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
Run Code Online (Sandbox Code Playgroud)
给定函数名称,我假设它们采用某种形式的参数.请注意,数组中的所有函数指针都应具有相同的签名 ; 也就是说,它们都应该具有相同的返回类型,以及相同数量和类型的参数.
当您通过指针调用函数时,C允许您删除显式取消引用,因此您可以将这些函数称为
a[0]();
a[1]();
Run Code Online (Sandbox Code Playgroud)
但我更喜欢第一种形式,即使它在视觉上更混乱.
请记住,[]函数调用的()优先级高于一元*,因此T *a[N]声明一个指向N元素的数组T,T (*a)[N]声明一个指向N元素数组的指针T,T *f()声明一个返回指针的函数T,并T (*f)()声明一个返回函数的指针T.