C中这两个令人困惑的函数指针表示法之间的区别?

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)

Mah*_*dsi 6

使用cdecl.org来解决这个问题,直到你可以不考虑它为止.

void (*a[]()):声明一个函数数组,返回指向void的指针

void (*a)()[]:声明一个指向函数返回void的数组的指针

后者无效C.

  • 函数数组在C中也是无效的. (7认同)

Joh*_*ode 5

他们都无效.

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.