Hallo zusammen, ich bin ein absoluter Neuling in C++. Ich habe gerade eine Frage bzgl. Funktionszeiger. Kurz und unkompliziert gefragt: void plot(double (*fp)()) { .... } void main(void) { plot(sin); plot(cos); } Im ersten Programmstück ist eine Funktion namens plot, die als Parameter einen Funktionszeiger erwartet. Meine Frage: Warum ist "sin" bzw. "cos" als Funktionszeiger zu betrachten (siehe bitte die main-Funktion)? "sin" bzw. "cos" sind doch ganz normale Funktionen, sie sind keine Funktionszeiger. Warum geht also plot(sin) ? Vielen Dank für Eure Hile. Grüße aus Rheinland, Leoni
Weil eben der Funktionsname ohne Argumentenklammern die Adresse der Funktion zurückgibt. Analog zu Arrays, die ohne Indexklammer auch einen Zeiger auf das erste Element zurückgeben (können).
Das sind die Schweinereien, die man mit C machen kann...
1 | int a = ...; |
2 | ((void(*)(int)) a) (42); |
Nimmt einen int und castet ihn zu einem Funktionszeiger wie er definiert würe per
1 | void a (int); |
und ruft diese Funktion mit 42 als Parameter auf. Ohne Rücksicht auf Verluste. Um eine Funktion aufrufen zu können bzw einen Aufruf in Code erzeugen zu können, braucht ein C/C++-Compiler den Code einer Funktion nicht zu kennen, sondern lediglich 1) einen Prototypen, der die Argument/Returnwertübergabe spezifiziert 2) die Startadresse, wobei er diese nicht explizit kennen muss. Diese kann ein Symbol sein, daß erst beim Linken festgelegt wird (Regelfall) oder in einer Variablen stehen (Funktionspointer).
Hallo zusammen, vielen Dank für die rasche Antwort. Simon K. meinte, dass sin in plot(sin) die Adresse von sin ausspucken würde. Mhh.. ich hab mal versucht, dies durch selbstgebasteltes Programm nachzuweisen, hat aber nicht geklappt. #include <iostream> using namespace std; double quadrat(double x){ return x*x; } int main() { cout << quadrat << endl; } es kam ein Fehler raus beim Kompilieren. Wisst Ihr vielleicht woran es liegt? Ich hatte erwartet, dass das Programm die Adresse von quadrat ausspuckt. Also, eine Adresse einer Funktion. Vielen Dank.. Leoni.
C++ weiß daß quadrat ne Funktion ist und wenn es ohne Parameter da steht geht der Compiler wohl von nem Syntaxfehler aus. Die Meldung wäre hilfreich gewesen. Versuch's mal mit printf oder den f-Pointer vor der Ausgabe zu casten.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.