RE:PROBLEMILLAS CON LOS PUNTEROS EN C
int *p (int, float);
Quiere decir que la función p retorna un puntero a un enetero, y obviamente recibe un entero y un real de simple precisión,(int, float).
int (*p) (int, float);
Quiere decir que p es un puntero a una función que retorna un enetero, que recibe un int y un float como argumentos.
int *(*p) (int, float);
Quiere decir que p es un puntero a una función que retorna un puntero enetero, que recibe un int y un float como argumentos.
int *p (int*, float);
Quiere decir que p es una función que retorna un puntero a un enetero, que recibe un punero a un int, y un float como argumentos.
int *p (int(*) (int,int), float);
Quiere decir que la función p retorna un puntero a un entero, y que recibe como primer parámetro un puntero a una función que retorna un entero, cuya función recibe dos enteros como argumentos. El otro argumento que recibe p es obviamente un float.
int (*p)( int(*) (int*,int), float);
Quiere decir que p es un puntero a una función, que recibe como primer argumento un puntero a una función, cuya función recibe a su vez un puntero a un entero, y un entero.El segundo argumento, obviamente es un float.
Punteros a funciones:
Se declaran encerrando entre (), el asterisco y un identificador, esto es importante, porque no es lo mismo:
void* p() que void(*p).
La primera es una función que retorna un puntero void, y la segunda es un puntero a una función void,(conocida también como procedimiento).
Tabién:
typedef void(*p)(int ) ;
...
void prueba(int );
......
p a=prueba;
Declaras p como un tipo nuevo, que sea un puntero a una función que reciba un entero. Luego declaras una función void que reciba un int, se la asignas a la variable "a", que tiene como tipo p; y luego puedes utilizar "a", para llamar a la función prueba o a cualquier función void, que reciba un entero como argumento. OJO!!!!!!!! Los tipos del valor de retorno y de los argumentos debe coincidir perfectamente