int(* f [])()之间的区别是什么?和int f []();

时间:2012-11-06 12:10:43

标签: c pointers function-pointers

我在指针C

中找到了这个
int f[]();  /* this one is illegal */

int (* f [])(); /* this one legal. */

我真的想知道第二个用法是什么。

谢谢。

4 个答案:

答案 0 :(得分:2)

如果您使用初始化块,则第二个示例非常有效。对于example

#include <stdio.h>
int x = 0;
int a() { return x++ + 1; }
int b() { return x++ + 2; }
int c() { return x++ + 3; }

int main() 
{
  int (* abc[])() = {&a, &b, &c};
  int i = 0,
      l = sizeof(abc)/sizeof(abc[0]);
  for (; i < l; i++) { 
    printf("Give me a %d for %d!\n", (*abc[i])(), i);
  }
  return 0;
}

答案 1 :(得分:1)

我不确定第二个例子是否合法,因为函数数组的大小是未知的,但它应该是一个函数指针数组,这里有一个可能的用法示例,如果大小将是众所周知的:

int a()
{
    return 0;
}

int main(int argc ,char** argv)
{
    int (* f [1])();
    f[0] = a;
}

答案 2 :(得分:1)

int f[](); //这是非法的,因为你无法创建一系列功能。它在C

中是非法的

但第二是合法的

int (* f [])();它说f是一个函数指针数组,返回int并且获取未指定数量的参数

答案 3 :(得分:1)

int f[]();  /* this one is illegal */

那是试图声明一系列函数,这是不可能的。

int (* f [])(); /* this one NOT legal, despite what the OP's post says. */

那是试图声明一个函数指针的数组,如果指定了数组大小,完全合法(并且合理),例如:

int (* f [42])(); /* this one legal. */

编辑:类型int (* f [])() 可以用作函数参数类型,因为对于函数参数类型,数组到指针的转换会立即发生,这意味着我们不需要指定(可能是多维)数组的最内层数组的维度:

void some_func(int (* f [])());  /* This is also legal. */