Wie typedef funktioniert für Funktionszeiger
Ich glaube, ich kann leiden die gefürchtete "zufälligen Programmierer" Krankheit, zumindest, wenn es um die Typdefinitionen und Funktionszeigern. Also ich habe experimentiert mit allen Arten von Kombinationen von diesen zu analysieren, die Ergebnisse, basierend auf die Ausgabe, die ich bekomme.
Aber als ich weiter versuchen, verschiedene Kombinationen, statt zu analysieren, die Ergebnisse bin ich jetzt nur verloren im Prozess.
Ich hoffe, Sie Jungs werden mir helfen herauszufinden, dieses Durcheinander.
Ersten code-Beispiel
typedef void (print)(void);
void do_something (void) { printf("Hello World\n"); }
print *pr;
pr = &do_something;
pr(); //Hello World
Zweiten code-Beispiel
typedef void (print)(void);
void do_something (void) { printf("Hello World\n"); }
print *pr;
pr = do_something;
pr(); //Hello World
Wie die obigen code-Beispiele funktionieren, es ist, als ob '&' hat keine Auswirkung auf die Funktion Namen
Dritten code-Beispiel
typedef void (print)(void);
void do_something (void) { printf("Hello World\n"); }
print pr;
pr = do_something; //compile error
pr = &do_something; //compile error
pr();
Ich hatte gehofft, eine der oben genannten Aufgaben, hier zu arbeiten, aber verdammt! Ich verstehe wirklich nicht, Funktionszeigern (und vielleicht typedef zu).
- Dies kann helfen, stackoverflow.com/questions/4298654/...
- Hmm... ich denke, sollten Sie sich eine "Expert-C-Programmierung' es explians C var-Regeln definieren. Ich werde versuchen, es zu finden für Sie online
- einfach die google-Expert-C-Programmierung, die erste ist das Buch. Suche 'Wie eine Erklärung Ist Gebildet" und ich denke du wirst die Antwort
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Adresse einer Funktion den Namen und die Ebene Funktion name beide das gleiche meinen, so
&
hat keine Wirkung auf eine Funktion den Namen.Ebenso, wenn mit der Funktion Zeiger, mehrfache Dereferenzierung ist kein problem:
Dass sauber kompiliert unter:
Ich würde nicht behaupten, dass mehrere stars ist guter Stil; das ist es nicht. Es ist 'ungerade, und (ja, man kann sagen, es), pervers'. Einer ausreichend ist (und der eine Stern ist vor allem für Leute wie mich, die erlernte das Programmieren in C vor dem standard sagte, "es ist OK zum aufrufen einer Funktion über einen Zeiger, ohne mit der
(*pointer_to_function)(arg1, arg2)
notation; Sie können schreiben Sie einfachpointer_to_function(arg1, arg2)
wenn Sie mögen"). Ja, es ist merkwürdig. Nein, kein anderer Typ (oder der Klasse von Typen) zeigt das gleiche Verhalten, Gott sei Dank.**f2
die Funktion Zeiger wird dereferenziert und die daraus resultierende Funktion sofort zerfällt wieder zu einem pointer, der dann wieder aufgelöst.int x[10];
, die Adressen derx
und&x
sind die gleichen. Aber Ihre Art ist anders, und Sie können nicht verwenden Sie den schönen Sternenhimmel Turm hier gezeigt.Ist die Sache mit Funktionszeigern ist, dass Sie die Funktion Zeiger! 🙂 So kommen Sie zu Ihrem Dritten Probe zu arbeiten:
In Bezug auf, ob Sie
funcName
oder&funcName
, spielt es keine Rolle (in C mindestens). Abschnitt6.3.2.1 Lvalues, arrays and function designators
Staaten:Es stellt sich heraus, dass in C/C++, beide
funcname
und&funcname
wird der Ertrag der Adressefuncname
zugewiesen werden können, um einen Funktionszeiger-variable. Dies ist eigentlich nur eine kuriosität, wie die syntax wurde für die Sprache(N).Wie C, C++ Zeiger auf Funktionen:
void (*)()
zum Beispiel ist ein Zeiger auf eine Funktion, die nimmt kein argument und gibt keinen Wert zurück. Aber C++ hat außerdem Verweise auf Funktionenvoid (&)()
und es gibt implizite Konvertierungen zwischen den beiden (obwohl ich erinnere mich nicht an die Regeln ganz genau).Daher:
funcname
ist ein Verweis auf die Funktion&funcname
ist ein Zeiger auf die FunktionBeachten Sie, dass unter der Adresse (oder eine Referenz auf) eine Funktion, die überladen erfordert eine
static_cast
zu den genauen Typ (nach beheben der überlastung).