函数指针数组

时间:2010-09-02 15:51:13

标签: c

我需要编写一个接收函数指针数组的函数。 我写了下面的代码,但是我现在正在测试它。

这是定义函数数组指针的正确方法吗?

typedef (*Function)(double);
void func(Function* arr);

如果我想用[20]声明数组的大小,我写道:

void func(Function arr[20]);

感谢您的帮助

4 个答案:

答案 0 :(得分:5)

首先,我通常用于计算复杂类型的方法。从标识符开始,然后一次添加其余的一步:

    f          -- f
    f[N]       -- is an N-element array
   *f[N]       -- of pointers
  (*f[N])()    -- to functions
T (*f[N])()    -- returning T

对于带有double参数并返回double值的函数的指针数组,这将是

double (*f[N])(double);

但是,请记住,在大多数情况下,数组类型的表达式“衰减”从类型“T的N元素数组”到“指向T的指针”。将数组表达式作为参数传递给函数时,函数实际接收的是指针。因此,您的函数将接收类型为“指向函数返回double的指针”类型的对象,而不是接收类型为“函数返回双指针的N元素数组”的对象,或者

double (**f)(double)

所以你的函数定义看起来像

void func(double (**f)(double))
{
  int i;
  ...
  for (i = 0; f[i] != NULL; i++)
  {
    double x = (*f[i])((double) i);
  }
}

调用者看起来像

double a(double x) {...}
double b(double x) {...}
double c(double x) {...}

void foo(void)
{
  double (*list[])(double) = {a, b, c, NULL};
  func(list);
}

如果您想使用typedef,可以使用以下内容:

typedef double Dblfunc(double);   // typedef for function type 
typedef Dblfunc *Dblfuncptr;      // typedef for function pointer type

void func(Dblfuncptr *f)
{
  int i;
  for (i = 0; f[i] != NULL; i++)
  {
    double x = (*f[i])((double) i);
    ...
  }
}
...
void foo(void)
{
  Dblfuncptr list[] = {a, b, c, NULL}; // EDIT: fixed type
  func(list);
}

使用typedef使数组和函数参数看起来更像常规类型。就个人而言,我更喜欢使用“原始”类型,因为它明确显示我正在处理函数指针,它显示了返回和参数类型。

答案 1 :(得分:3)

如果更正typedef以包含返回类型typedef void (*Function)(double);,那么该数组声明将正常工作。您可以通过为数组大小写调用(arr[index])(3.14)来调用它。

BTW:http://www.newty.de/fpt/fpt.html是函数指针的一个方便参考。

答案 2 :(得分:0)

该功能返回什么?你是函数指针typedef中的返回类型,就像你应该有像

这样的东西
typedef double (*Function)(double);

答案 3 :(得分:0)

它看起来几乎正确我认为你在声明功能时忘记了返回类型:

typedef int (*Function)(double)

代替

第二个声明也是无效的我认为因为指定函数参数的数组大小无效

void func (Function*)

会做得很好