Funktionszeigerparameter ohne Sternchen

Lesezeit: 3 Minuten

Benutzer-Avatar
Freimann

Ich habe diese Definition einer Funktion gesehen, die einen Funktionszeiger als Parameter erhält:

double fin_diff(double f(double), double x, double h  = 0.01) {
  return (f(x+h)-f(x)) / h;
}

Ich bin es gewohnt, diese Definition mit einem Sternchen zu sehen, dh:

double fin_diff(double (*f)(double), double x, double h  = 0.01);

Wissen Sie, warum die erste Definition auch gültig ist?

  • Funktionen und Funktionszeiger haben dieselbe Bedeutung, wenn sie als Parameter einer Funktion verwendet werden.

    – Hacken

    22. Juli 2019 um 10:09 Uhr


  • Während Sie über Funktionszeiger und dergleichen Bescheid wissen müssen, sollten Sie sie in C++ wirklich nicht selbst verwenden, wenn Sie es vermeiden können. Wenn Sie beabsichtigen, die Funktion wie im gezeigten Beispiel direkt aufzurufen, verwenden Sie stattdessen Vorlagen. Ansonsten verwenden std::function. Verwenden von Vorlagen bzw std::function erhöht die Flexibilität, indem Sie jede Art von aufrufbarem Objekt mit der richtigen Signatur übergeben können, wie z. B. ein Lambda, ein Funktorobjekt, ein tatsächlicher Funktionszeiger usw.

    – Irgendein Programmierer-Typ

    22. Juli 2019 um 10:10 Uhr

  • Die Sprachen c und c++ sind zwei verschiedene Sprachen. Bitte wählen Sie eine aus und entfernen Sie die andere tag da die Antwort je nach Sprache unterschiedlich ist

    – Benutzer3629249

    22. Juli 2019 um 19:14 Uhr


Benutzer-Avatar
Benutzer7860670

Standard sagt, dass diese beiden Funktionen äquivalent sind, da Funktionsargumente so angepasst werden, dass sie ein Zeiger auf Funktionsargumente sind:

16.1 Überladbare Deklarationen [over.load]

(3.3) Parameterdeklarationen, die sich nur darin unterscheiden, dass die eine ein Funktionstyp und die andere ein Zeiger auf denselben Funktionstyp ist, sind äquivalent. Das heißt, der Funktionstyp wird angepasst, um ein Zeiger auf den Funktionstyp (11.3.5) zu werden.

dasselbe in C:

6.7.5.3 Funktionsdeklaratoren (einschließlich Prototypen)

8 Eine Deklaration eines Parameters als „Funktionsrückgabetyp“ muss wie in 6.3.2.1 zu „Zeiger auf Funktionsrückgabetyp“ angepasst werden.

  • Welcher Standard? C oder C++?

    – Giacomo Alzetta

    23. Juli 2019 um 7:51 Uhr

  • @GiacomoAlzetta Ich habe auch ein Zitat aus dem C-Standard hinzugefügt. Der erste stammt offensichtlich aus C++, da C keine Überladungen hat

    – Benutzer7860670

    23. Juli 2019 um 8:57 Uhr

Zeiger auf Funktionen sind eigenartig. Gegeben eine Funktion void f();du kannst tun

void (*fptr)() = f;
void (*fptr)() = &f;
void (*fptr)() = &&f;
void (*fptr)() = &&&f;

Ad infinitum.

Ähnlich ist es, wenn Sie eine Funktion über einen Zeiger auf eine Funktion aufrufen

fptr();
(*fptr)();
(**fptr)();
(***fptr)();

Ad infinitum.

Alles bricht zusammen.

  • Was ist die Motivation dafür? Es ist nicht so, dass diese unendliche Verkettung ansonsten unmöglich wäre (stellen Sie sich einen Zeiger vor, dessen referenzierter Wert seine eigene Adresse enthält), aber ich verstehe nicht, warum sich alle Funktionen so verhalten sollten.

    – Alexander

    23. Juli 2019 um 3:25 Uhr

  • @Alexander – es ist im Nebel der Zeit verloren gegangen.

    – Peter Becker

    23. Juli 2019 um 12:39 Uhr

  • @Alexander – ernsthaft, das kommt von C und war, soweit ich weiß, schon immer der Fall. Ich kenne den Grund dafür nicht.

    – Peter Becker

    23. Juli 2019 um 12:41 Uhr

  • Laut James McNellis ist es das Das beste Feature von C++.

    – Wes Tolemann

    23. Juli 2019 um 15:00 Uhr


  • Ich finde &&f, &&&f,… tut nicht Arbeit. **fptr funktioniert aber.

    – Sternchen

    29. August um 7:54 Uhr

Wird ein Funktionsparameter als Funktionsdeklaration angegeben, passt der Compiler den Parameter implizit selbst als Funktionszeiger an.

Es ist ähnlich, wenn ein Funktionsname als Argument einer anderen Funktion übergeben wird, wie zum Beispiel

fin_diff( func_name, 10.0 );

der Compiler wandelt wiederum implizit den Funktionsbezeichner in einen Zeiger auf die Funktion um.

1352510cookie-checkFunktionszeigerparameter ohne Sternchen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy