c语言指针引用 - 函数指针作为参数




你如何将函数作为C中的参数传递? (4)

我想创建一个函数,该函数执行一组数据上通过参数传递的函数。 你如何将函数作为C中的参数传递?


宣言

采用函数参数的函数的原型如下所示:

void func ( void (*f)(int) );

这表明参数f将是一个指向具有void返回类型的函数的指针,并且该函数接受一个int参数。 下面的函数( print )是一个函数的例子,它可以作为参数传递给func ,因为它是正确的类型:

void print ( int x ) {
  printf("%d\n", x);
}

函数调用

当使用函数参数调用函数时,传递的值必须是指向函数的指针。 使用该函数的名称(不带圆括号):

func(print);

将调用func ,将打印功能传递给它。

功能体

与任何参数一样,func现在可以在函数体中使用该参数的名称来访问该参数的值。 假设func将把它传递给数字0-4的函数应用。 首先考虑一下循环看起来像直接调用print的方式:

for ( int ctr = 0 ; ctr < 5 ; ctr++ ) {
  print(ctr);
}

由于func的参数声明表示f是指向所需函数的指针的名称,我们首先记得如果f是指针,那么*ff指向的东西(即在这种情况下的函数print )。 因此,只需用*f替换上面循环中每次出现的打印:

void func ( void (*f)(int) ) {
  for ( int ctr = 0 ; ctr < 5 ; ctr++ ) {
    (*f)(ctr);
  }
}

http://math.hws.edu/bridgeman/courses/331/f05/handouts/c-c++-notes.html


将函数的地址作为参数传递给另一个函数 ,如下所示

#include <stdio.h>

void print();
void execute(void());

int main()
{
    execute(print); // sends address of print
    return 0;
}

void print()
{
    printf("Hello!");
}

void execute(void f()) // receive address of print
{
    f();
}

我们也可以使用函数指针传递函数作为参数

#include <stdio.h>

void print();
void execute(void (*f)());

int main()
{
    execute(&print); // sends address of print
    return 0;
}

void print()
{
    printf("Hello!");
}

void execute(void (*f)()) // receive address of print
{
    f();
}

你需要传递一个函数指针 。 这个语法有点麻烦,但是一旦你熟悉它,它的确很强大。


这个问题已经有了定义函数指针的答案,但是它们可能会变得非常混乱,特别是如果你要将它们传递给你的应用程序。 为了避免这种不愉快,我建议你将函数指针变成更可读的类型。 例如。

typedef void (*functiontype)();

声明一个返回void且不带参数的函数。 要创建一个这种类型的函数指针,你现在可以这样做:

void dosomething() { }

functiontype func = &dosomething;
func();

对于一个函数,返回一个int,并采取一个字符,你会做的

typedef int (*functiontype2)(char);

并使用它

int dosomethingwithchar(char a) { return 1; }

functiontype2 func2 = &dosomethingwithchar
int result = func2('a');

有些库可以帮助将函数指针转换为可读的类型。 boost函数库很棒,非常值得努力!

boost::function<int (char a)> functiontype2;

比上面好得多。





parameters