[C con Clase] cast con punteros a funciones

Programante programante en gmail.com
Jue Mayo 6 19:27:32 CEST 2010


El 06/05/10 13:28, Matias V. escribió:
> Hola tengo la siguiente duda,
>  
> Supongamos que tengo la siguiente funcion
>  
> int prueba(void(*algo)(void*))
> {
>    int a=5;
>    
>    (*algo)(&a);
> }
>   
> y por ejemplo esta otra
>  
> void ejemplo(int * b)
> {
>     printf ("%i",*b);
> }
>  
> en el main invoco a prueba haciendo un cast:
>  
> int main()
> {
>   prueba( (void(*)(void*))ejemplo);
> }
>  
> lo que no entiendo es por que todo funciona correctamente, es decir al
> hacer el cast el argumento de ejemplo  (de acuerdo a lo que tengo
> entendido) se convierte en un puntero void por lo cual el compilador
> me debería tirar error al intenetar imprimir el contenido de una
> varible apuntada por un puntero void, tal como ocurre en este ejemplo.

En C un puntero a void es un puntero a cualquier cosa. Como apunta a
cualquier cosa, no puedes hallar lo que tiene, pero todos los punteros a
algo pueden convertirse en punteros a cualquier cosa (mientras que si en
vez de un void* usaras por ejemplo un int perderías dígitos en algunas
arquitecturas, estropeando el puntero).

En el momento en que lo imprimes, no estás imprimiendo el contenido de
un puntero a void, sino de un puntero a int que, por lo tanto, es un entero.
Era un puntero a entero, que convertiste en puntero a void y luego
recuperaste a puntero a int. Es todo correcto. El void* sirve para pasar
el puntero.
Si en cambio hubieras definido a como un float, el código no daría
errores (con las conversiones no sabe el tipo correcto) pero a la hora
de imprimirlo te pondría cualquier otro valor.





Más información sobre la lista de distribución Cconclase