Warum sind diese beiden Funktionszeiger in C / C ++ zulässig?

8

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?

    
Electric Coffee 27.10.2013, 11:20
quelle

4 Antworten

7

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%     
altariste 27.10.2013, 11:29
quelle
6

(*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:

%Vor%

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:

%Vor%

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%     
Eric Postpischil 27.10.2013 11:46
quelle
1

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%     
Sarp Kaya 27.10.2013 11:38
quelle
0

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.

    
Igor Popov 27.10.2013 11:30
quelle