(*fun)(m,n)
die gleiche ist wie fun(m,n)
aufgrund Regeln in C und C++, die Funktionen Zeiger auf Funktionen konvertieren.
In C 2011 ist die Regel Klausel 6.3.2.1 4: "A Funktion Bezeichner ist ein Ausdruck, der Funktionstyp hat. Außer wenn es der Operand des Operators sizeof ist, die _Alignof Operator oder unäre & Operator, eine Funktion Bezeichner mit dem Typ „Funktion Typ zurückkehr“ wird in einen Ausdruck umgewandelt dieses Typs „Zeiger hat Funktion zurück Typ ". 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. Dann, da foo
ein Zeiger auf die Funktion ist, ist *foo
die Funktion. Das heißt, Sie schreiben:
(*fun)(m,n)
Das Ergebnis ist, dass fun
automatisch in einen Zeiger umgewandelt wird, dann *
auf die Funktion ausgewertet wird, dann wird *fun
in einen Zeiger umgewandelt zurück, dann wird die Funktion aufgerufen. Sie können dies auch weiterhin und schreiben:
(**************fun)(m,n)
Dies ist die gleiche wie fun(m,n)
ist. Jedes *
erzeugt die Funktion erneut, aber der Compiler konvertiert es automatisch zurück in einen Zeiger. Du kannst diese Schlacht für immer fortsetzen, aber der Compiler wird immer gewinnen.
In der Tat, diese alle den gleichen Effekt haben:
(&fun)(m,n)
(fun)(m,n)
(*fun)(m,n)
Da entweder Syntax (mit oder ohne Sternchen) ist gültig für eine Funktion über einen Zeiger aufgerufen wird. Der zweite Fall ist ein Aufruf (Sie können an den Klammern erkennen und Parameter übergeben). – StoryTeller
Weder ist gut. Sie sollten '(*** fun) (m, n)' verwenden, um sich als Drei-Sterne-Programmierer zu qualifizieren. –