void printMensaje (float dato);
main()
void printMensaje(float dato)
void printNumero(float dato)
#include <iostream.h>
void printNumero (float dato);
void (*funcPuntero)(float);
{
float pi = 3.14159;
printMensaje(pi);
funcPuntero = printMensaje;
funcPuntero (pi);
funcPuntero = printNumero;
funcPuntero (pi);
printNumero(pi);
}
{
cout <<" Esta es la funcion printMensaje " <<'\n';
}
{
cout <<" Este es el dato: " << dato << '\n';
}
La salida del programa será:
Esta es la funcion printMensaje
Esta es la funcion printMensaje
Este es el dato: 3.14159
Este es el dato: 3.14159
Hemos declarado dos funciones, printMensaje
y printNumero
, y después funcPuntero
, que es un
puntero a una función que recibe un parámetro real y no devuelve nada (void). Las dos
funciones declaradas anteriormente se ajustan precisamente a este perfil, y por tanto pueden ser
llamadas por este puntero.
En la función principal, llamamos a la función printMensaje
con el parámetro
pi
, y en la línea siguiente asignamos al puntero a función funcPuntero
el valor de
printMensaje
y utilizamos el puntero para llamar a la misma función de nuevo. Por tanto, las
dos llamadas a la función printMensaje
son idénticas gracias a la utilización
del puntero funcPuntero
.
Dado que hemos asignado el nombre de una función a un puntero a función, y el
compilador no da error, el nombre de una función debe ser un puntero a una función.
Esto es exactamente lo que sucede. Un nombre de una función es un puntero a esa
función, pero es un puntero constante que no puede ser cambiado. Sucede lo mismo con los
vectores: el nombre de un vector es un puntero constante al primer elemento del vector.
Ya que el nombre de una función es un puntero a esa función, podemos asignar el
nombre de una función a un puntero constante, y usar el puntero para llamar a la
función. Pero el valor devuelto, así como el número y tipo de
parámetros deben ser idénticos. Muchos compiladores de C y C++ no avisan de las
diferencias entre las listas de parámetros cuando se hacen las asignaciones. Esto se debe a
que las asignaciones se hacen en tiempo de ejecución, cuando la información de este
tipo no está disponible para el sistema.
Si en el ejemplo anterior añadimos una función que tiene como parámetro un
entero e intentamos
llamarla con el puntero a función funcPuntero
, el compilador lanzará el siguiente
mensaje de error:
error: In this statement, the referenced type of the pointer value "print_int"
is "function (int) returning void", which is not compatible with "function (float) returning void".
Compilation terminated with errors.
Comentarios, sugerencias, ideas...
© Beatriz Fuentes Arenaz, 1996-1997