2011-09-22 8 views
14

Duplicar posibles:
How does dereferencing of a function pointer happen?función de puntero - eliminación de referencias automática

void myprint(char* x) { 
     printf("%s\n", x); 
    } 

    int main() { 
    char* s = "hello"; 
    void (*test)(char*); 
    void (*test2)(char*); 

    test = myprint; 
    test2 = &myprint; 

    test(s); 
    (*test)(s); 
    test2(s); 
    (*test2)(s); 

    } 

Puede alguien explicarme por qué todo el código anterior es válido? "hola" se imprimió cuatro veces. Al aplicar el puntero a la función, ¿está implícitamente desbocado? Básicamente, quiero saber cómo se almacenan los punteros a las funciones, porque lo anterior es un poco confuso.

+0

'(****** prueba) (s)' también es válido :-) – sidyll

+1

Ver esta pregunta anterior: http://stackoverflow.com/questions/2795575/how-does-dereferencing-of-a -function-pointer-happen –

+1

Las funciones y los punteros a las funciones son especiales, su tratamiento no es uniforme con ningún otro tipo de puntero. Consulte [¿Cómo ocurre la desreferenciación de un puntero a la función?] (Http://stackoverflow.com/q/2795575/2509) y otras preguntas en la barra lateral. – dmckee

Respuesta

26

esto es sólo un capricho de la C. No hay ninguna otra razón, pero el nivel C se limita a decir que la eliminación de referencias o de tomar la dirección de una función solo se evalúa como un puntero a esa función, y la eliminación de referencias a un puntero de función simplemente evalúa de nuevo a la puntero de función.

Este comportamiento es (por lo tanto, obviamente) muy diferente de cómo los operadores unitarios & y * funcionan para las variables normales.

Así,

test2 = myprint; 
test2 = &myprint; 
test2 = *myprint; 
test2 = **********myprint; 

Todo acaba de hacer exactamente lo mismo, le da un puntero de función a myprint

Del mismo modo,

test2(s); 
(*test2)(s); 
(***********test2)(s); 

hace lo mismo, llame a la función de puntero almacenado en test2. Porque C dice que sí.

Cuestiones relacionadas