2009-11-08 167 views

回答

7

不,您不能传递'function'作为参数。但是,您可以将指针传递给函数。

当您通过名称引用一个没有函数调用括号的函数时,您引用了一个指向函数的指针。因此,例如,我们可以认为,产生值表的数学函数功能:

#include <math.h> 
#include <stdio.h> 

static void generator(double lo, double hi, double inc, double (*function)(double)) 
{ 
    double x; 
    for (x = lo; x < hi; x += inc) 
     printf("x = %6g; f(x) = %6g\n", x, (*function)(x)) 
} 

int main(void) 
{ 
    generator(0.0, 1.0, 0.02, sin); 
    generator(0.0, 1.0, 0.02, cos); 
    generator(0.0, 1.0, 0.02, sqrt); 
    return(0); 
} 

这里,函数“罪()”,“COS()”和“开方()”都具有相同的原型架构:函数采用双参数并返回一个double值。需要注意的是,如果我错误地写道:

generator(0.0, 1.0, 0.02, sin()); 

我会得到一堆编译错误 - 一个因为“罪()”需要一个参数,而另一个因为“发生器()”需要一个指向一个功能,而不是作为最后一个参数的双重值。

(另请注意,一个好的方案至少会识别它是计算功能,以及双号的重复增量是不准确的好主意。这只是一个例子。)

9

使用指向函数的指针。
int (*ptr2_fun)() 接收功能的存在:
int execute_your_function(int (*fun)())

这里有一些examples

+0

一个例子会很棒! – 2009-11-08 18:07:08

+2

检查qsort()。它接受比较功能。 – Alexandru 2009-11-08 18:09:35

3

当然,你可以使用函数指针。

#include <stdio.h> 
typedef void (*bar_callback)(void); 

void foo(void) 
{ 
    puts("foo"); 
} 

void bar(bar_callback callback) 
{ 
    puts("bar"); 
    callback(); 
} 
int main(int argc,char **argv) 
{ 
    bar(foo); 
    return 0; 
} 
3

。不是函数本身而是指向函数的指针。

请参阅qsort()

int cmp(const void *a, const void *b) { /* ... */ } 
/* ... */ 
qsort(data, nelems, sizeof *data, cmp); /* pass the function `cmp` to qsort() */ 
相关问题