Ich habe diese zwei Testfunktionen:
%Vor%sie scheinen etwas anderes zu geben, also warum ergeben beide das gleiche Ergebnis?
%Vor%Ich hätte angenommen, dass einer von ihnen die Zeigeradresse oder den Zeiger selbst zurückgeben würde; anstatt den Wert auf dem Zeiger gespeichert ...
Warum macht es das?
Weil C ++ syntaktischen Zucker bietet, wenn es darum geht, die Adresse von Nichtmitgliedsfunktionen zu handhaben und Zeiger darauf zu verwenden.
Man kann die Adresse einer solchen Funktion bekommen:
%Vor%mit entweder:
%Vor%oder:
%Vor%Es gibt auch syntaktischen Zucker für die Verwendung eines solchen Pointers, entweder Call-Point-to-Funktion mit:
%Vor%oder mit vereinfachter Syntax:
%Vor% (*fun)(m,n)
ist dasselbe wie fun(m,n)
aufgrund von Regeln in C und C ++, die Funktionen in Zeiger auf Funktionen konvertieren.
In C 2011 ist die Regel in Klausel 6.3.2.1 4: "Ein Funktionsbezeichner ist ein Ausdruck mit einem Funktionstyp. Außer wenn es der Operand des Operators sizeof ist, der _Alignof-Operator oder der unäre & amp; -Operator, ein Funktionsbezeichner mit dem Typ "function" Rückgabe des -Typs "wird in einen Ausdruck konvertiert, der vom Typ" Zeiger auf Funktion Typ "zurückgegeben wird. In C ++ ist die Regel Klausel 4.3.
Beachten Sie, dass ein Funktionsbezeichner nicht nur ein Bezeichner ist, der eine Funktion benennt. Es könnte eine Kennung sein, oder es könnte ein anderer Ausdruck sein. Wenn beispielsweise foo
der Name einer Funktion ist, wird sie automatisch in einen Zeiger auf eine Funktion umgewandelt. Da foo
ein Zeiger auf die Funktion ist, ist *foo
die Funktion. Das bedeutet, Sie können schreiben:
Das Ergebnis ist, dass fun
automatisch in einen Zeiger konvertiert wird, dann wird *
für die Funktion ausgewertet, dann wird *fun
in einen Zeiger zurückkonvertiert, dann wird die Funktion aufgerufen. Sie können dies fortsetzen und schreiben:
Dies ist das gleiche wie fun(m,n)
. Jedes *
erzeugt die Funktion erneut, aber der Compiler konvertiert sie automatisch zurück in einen Zeiger. Du kannst diese Schlacht für immer fortsetzen, aber der Compiler wird immer gewinnen.
Tatsächlich haben alle dieselbe Wirkung:
%Vor%Dies liegt daran, dass Sie keine Speicheradressen dieser Werte zurückgeben. Das Aufrufen einer Funktion mit Zeiger ändert ihren Wert nicht, sie ruft die Funktion noch immer auf. Was Sie tun können, ist, einen Wert an eine Variable zurückzugeben und dann ihre Speicheradresse zu erhalten, wie zum Beispiel:
%Vor% In C- und C ++ - Namen von Funktionen sind auch die Zeiger auf den Funktionscode. Wie jeder Zeiger können Sie sie mithilfe von *
dereferenzieren, was im Fall von Funktionszeigern den Aufruf der Funktion bedeutet, wenn zusätzlich zur Dereferenzierung auch eine Paranthese verwendet wird, wie in Ihrem apply_a
-Fall. Aber auch ein gültiger Aufruf der C- und C ++ - Funktion ruft sie einfach nach ihrem Namen auf, nämlich apply_b
case.
Tags und Links c c++ pointers function-pointers return