2011-09-22 18 views
14

Eventuali duplicati:
How does dereferencing of a function pointer happen?Puntatore Funzione - Dereferencing automatico

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); 

    } 

qualcuno può spiegare a me perché tutto il codice di cui sopra è valido? "ciao" viene stampato quattro volte. Applicando il puntatore alla funzione, è implicitamente escluso? Fondamentalmente voglio sapere come vengono effettivamente memorizzati i puntatori di funzione, perché quanto sopra è un po 'di confusione.

+0

'(****** test) (s)' è valido anche :-) – sidyll

+1

Vedere questa domanda precedente: http://stackoverflow.com/questions/2795575/how-does-dereferencing-of-a -function-pointer-happen –

+1

Le funzioni e i puntatori di funzione sono speciali, il loro trattamento non è uniforme con nessun altro tipo di puntatore. Vedi [Come si verifica il dereferenziamento di un puntatore a funzione?] (Http://stackoverflow.com/q/2795575/2509) e altre domande nella barra laterale. – dmckee

risposta

26

Questa è solo una stranezza di C. Non c'è altro motivo se non lo standard C dice semplicemente che il dereferenziazione o l'assunzione dell'indirizzo di una funzione si limita a un puntatore a tale funzione e il dereferenziamento di un puntatore a una funzione viene semplicemente valutato nuovamente puntatore di funzione.

Questo comportamento è (quindi ovviamente) molto diverso da come gli operatori unari & e * funzionano per le variabili normali.

Quindi,

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

Tutti basta fare esattamente la stessa cosa, ti dà un puntatore a funzione per myprint

Allo stesso modo,

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

fa lo stesso, chiamare il puntatore a funzione memorizzata in test2. Perché C dice di sì.