2009-11-24 15 views
24

¿Es posible pasar un puntero de función como argumento a una función en C?Puntero de función como argumento

En caso afirmativo, ¿cómo declararía y definiría una función que toma un puntero de función como argumento?

Respuesta

49

Definitivamente.

void f(void (*a)()) { 
    a(); 
} 

void test() { 
    printf("hello world\n"); 
} 

int main() { 
    f(&test); 
    return 0; 
} 
+3

Cambiar la llamada a f (prueba); –

+6

Ambos funcionarán. El ampersand es opcional. Así que está desreferenciando el puntero cuando está llamando al puntero de la función. –

+0

Cierto, no hay necesidad de cambiar nada. Además, incluso la sintaxis "puntero" en la declaración de parámetro es opcional. La 'f' anterior podría haberse declarado como' void f (void a()) '. – AnT

20

Let famosa dice que tiene la función

int func(int a, float b); 

Así puntero a ella será

int (*func_pointer)(int, float); 

Así que usted podría utilizar es así

func_pointer = func; 
    (*func_pointer)(1, 1.0); 

    /*below also works*/ 
    func_pointer(1, 1.0); 

de no especificar plena tipo de puntero cada vez que lo necesite que baremo typedef que

typedef int (*FUNC_PTR)(int, float); 

y que utiliza como cualquier otro tipo

void executor(FUNC_PTR func) 
{ 
    func(1, 1.0); 
} 

int silly_func(int a, float b) 
{ 
    //do some stuff 
} 

main() 
{ 
    FUNC_PTR ptr; 
    ptr = silly_func; 
    executor(ptr); 
    /* this should also wotk */ 
    executor(silly_func) 
} 

Sugiero mirar el mundo-famosa C faqs .

2

Comprobar qsort()

void qsort(void *base, size_t nmemb, size_t size, 
      int (*compar)(const void *, const void *)); 

El último argumento de la función es un puntero de función. Cuando llame al qsort() en un programa suyo, la ejecución "entra en la biblioteca" y "regresa a su propio código" mediante el uso de ese puntero.

5

un buen ejemplo:

#include <iostream> 
using namespace std; 

int sum(int a, int b) 
{ 
    return a + b; 
} 

int mul(int a, int b) 
{ 
    return a * b; 
} 

int div(int a, int b) 
{ 
    return a/b; 
} 

int mathOp(int (*OpType)(int, int), int a, int b) 
{ 
    return OpType(a, b); 
} 

int main() 
{ 

    cout << mathOp(sum, 10, 12) << ", " << mathOp(div, 10, 2) << endl; 
    return 0; 
} 

salida es: '22, 5'

Cuestiones relacionadas