Ich weiß, dass ein Funktionszeiger die Adresse einer Funktion speichert.
wo ist die Adresse, die ein Funktionszeiger speichert
int fun(int x){
//return something
}
int (pfun*)(int)=&fun;
int main(){
std::cout << &fun << "\n"; // this print out 1
std::cout << fun << "\n" ; // this print out 1
std::cout << &pfun << "\n"; // this print out 0x0022ff40
std::cout << pfun << "\n" ; // this print out 1
}
So sind meine Fragen:
1) wenn der Spaß() hat noch nicht einmal eine Adresse wie Punkt Spaß macht Pfun kann().
2) zum Beispiel in dynamischer Bindung, wenn ich eine Zeigerfunktion zur Laufzeit verwende. Ändert der Compiler den Wert von pfun in einen echten Zeiger wie 0X ..... so dass zur Laufzeit wissen wird, welche Funktion aufgerufen werden soll, da die Namen nach der Kompilierung nicht existieren?
Wenn ich mich richtig erinnere, Casting eines Funktionszeigers auf 'void *' ist nicht erlaubt. Der Standard sagt das explizit, ich denke ... oder war es speziell Mitglied Funktionszeiger, müssen überprüfen .. –
@Als: das ist der Grund für die * nicht technisch korrekt * Kommentar in der Antwort. Tatsache ist, dass IIRC in den meisten Architekturen funktioniert, der Standard garantiert dies nicht, weil einige Plattformen in der Vergangenheit unterschiedliche Zeigergrößen für Funktionen und Daten hatten, was bedeutet, dass das Umwandeln in 'void *' und zurück zum Original nicht funktionieren würde ergibt das ursprüngliche Ergebnis ... Dann wieder, wie ich bereits erwähnt habe, sogar in den Plattformen, wo es einen Wert produziert, ist es nutzlos. –
Ist die explizite Erwähnung, einen Funktionszeiger auf "void *" zu schreiben, ungültig, nur für Mitgliedsfunktionszeiger anwendbar? oder sogar freistehende Funktionszeiger? –