2

我在 C 的指针中找到了这个

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

和:

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

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

谢谢你。

4

4 回答 4

2

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

#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;
}
于 2012-11-06T12:25:21.830 回答
1

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

int a()
{
    return 0;
}

int main(int argc ,char** argv)
{
    int (* f [1])();
    f[0] = a;
}
于 2012-11-06T12:16:59.120 回答
1

int f[]();// 这是非法的,因为你不能创建函数数组。在里面是违法的C

但第二个是合法的

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

于 2012-11-06T12:19:01.887 回答
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 [])() 可以用作函数参数类型,因为对于函数参数类型,数组到指针的转换会立即发生,这意味着我们不需要指定 a 的最内层数组的维度(可能是多维的)大批:

void some_func(int (* f [])());  /* This is also legal. */
于 2012-11-06T12:25:51.933 回答