2012-02-04 11 views
6

Mientras escucha a través de un curso de Stanford Programming Abstractions, me encuentro con alguna pieza de código que se parece a la siguiente.función como parámetro vs puntero de función como parámetro

void plot(double start, double end, double (fn)(double)) { 
    double i; 
    for (i = start; i <= end; i += 1) 
     printf("fn(%f) = %f\n", i, fn(i)); 
} 

double plus1(double x) { 
    return x + 1; 
} 

int main(void) { 
    plot(1, 10, plus1); 
    return 0; 
} 

He compilado el código en mi sistema usando GCC, luego G ++; ambos corren perfectamente.

sé que el paso de una int i = 2 en una función como void func1(int a) hará una nueva copia de ese i para esa función al pasar a &ivoid func2(int *a) sólo dará a la función func2 la dirección de i.

Así Puede alguien explicar a mí lo que es el mecanismo para transmitir a fnplot y cómo se diferencia del que pasa un puntero a función como parámetro?

Respuesta

7

no hay absolutamente ninguna diferencia entre void foo(double fn(double)) y void foo(double (*fn)(double)). Ambos declaran funciones que toman un puntero a una función como parámetro.

Esto es similar a la forma en que no hay diferencia entre void bar(double arr[10]) y void bar(double* arr).

+0

¿Tiene una referencia a su segunda reclamación sobre matrices? Especialmente cuando es C++? – krlmlr

+0

Hay una diferencia poco, en el primer caso, 'fn' es implcitly un puntero a la función, y en el último' fn' se declara explícitamente puntero a funcionar –

+3

@ user946850: '§8.3.5/5': ... Después determinando el tipo de cada parámetro, cualquier parámetro de tipo "array of T" o "function return T" se ajusta para que sea "puntero a T" o "puntero a función que devuelve T", respectivamente. ... – Mankarse

0

lo siento por mi error.

void foo(int (fn)(int)){} 
void bar(int (*fn)(int)){} 

compilar por encima de código como este:

gcc -S Ejemplo.c

se encuentra que no hay diferencia. solo un estilo de codificación diferente.

se puede tratar de compilar y ejecutar el código así:

#include <stdio.h> 
void foo(int (fn)(int)) 
{ 
    printf("foo: %x.\n",fn); 
} 
void bar(int (*fn)(int)) 
{ 
    printf("bar: %x.\n",fn); 
} 
int main(int argc) 
{ 
    foo(main); 
    bar(main); 
    return 0; 
} 
+0

Por favor lea mi pregunta nuevamente. Solicité la diferencia entre un puntero de función en una lista de parámetros frente a un prototipo de función en una lista de parámetros. – MrOrdinaire

+0

mi culpa. Escribí una nueva respuesta. – for1096

Cuestiones relacionadas