work with sirven sencillos que punteros puntero pointer parametro para los funciones funcion ejemplos declarar con como change arreglos c++ c function-pointers function-declaration

c++ - with - void pointer function c



Parámetro de puntero de función sin asterisco (3)

He visto esta definición de una función que recibe un puntero de función como parámetro:

double fin_diff(double f(double), double x, double h = 0.01) { return (f(x+h)-f(x)) / h; }

Estoy acostumbrado a ver esta definición con un asterisco, es decir:

double fin_diff(double (*f)(double), double x, double h = 0.01);

¿Sabes por qué la primera definición también es válida?


Los punteros a las funciones son peculiares. Dada una función void f(); , tu puedes hacer

void (*fptr)() = f; void (*fptr)() = &f; void (*fptr)() = &&f; void (*fptr)() = &&&f;

indefinidamente.

Del mismo modo, cuando llama a una función a través de un puntero para que funcione, puede hacer

fptr(); (*fptr)(); (**fptr)(); (***fptr)();

indefinidamente.

Todo se derrumba.


Si un parámetro de función se especifica como una declaración de función, el compilador mismo ajusta implícitamente el parámetro como un puntero de función.

Es similar a cuando se pasa el nombre de una función como argumento de alguna otra función como, por ejemplo,

fin_diff( func_name, 10.0 );

el compilador vuelve a convertir implícitamente el designador de la función en un puntero a la función.


Standard dice que estas dos funciones son equivalentes ya que los argumentos de la función se ajustan para ser un puntero a los argumentos de la función:

16.1 Declaraciones sobrecargables [sobrecarga]
(3.3) Las declaraciones de parámetros que difieren solo en que una es un tipo de función y la otra es un puntero al mismo tipo de función son equivalentes. Es decir, el tipo de función se ajusta para convertirse en un puntero al tipo de función (11.3.5).

lo mismo en C:

6.7.5.3 Declaradores de funciones (incluidos los prototipos)
8 Una declaración de un parámetro como "tipo de retorno de función" se ajustará a "puntero al tipo de retorno de función", como en 6.3.2.1.