Ich kann das nicht herausfinden:
int main() {
int (*) (int *) = 5;
return 0;
}
Die obige Zuordnung wird mit g ++ c ++ 11 kompiliert. Ich weiß, dass dies int (*) (int *)
ein Zeiger auf eine Funktion ist, die ein (int *)
Argument als akzeptiert und ein int zurückgibt, aber ich verstehe nicht, wie Sie es mit 5 gleichsetzen können. Zuerst dachte ich, es ist eine Funktion, die ständig 5 zurückgibt (aus meinem letzten Lernen in F #, wahrscheinlich, haha), dann dachte ich kurz, dass der Funktionszeiger auf Speicherplatz 5 zeigt, aber das funktioniert eindeutig nicht und Hex-Werte auch nicht.
Da ich dachte, dass dies daran liegen könnte, dass die Funktion ein int zurückgibt und dass das Zuweisen eines int (irgendwie) in Ordnung ist, habe ich auch Folgendes versucht:
int * (*) (int *) = my_ptr
Dabei my_ptr
handelt es sich um int *
den gleichen Typ wie dieser zweite Funktionszeiger, wie im ersten Fall mit dem Typ int. Dies wird nicht kompiliert. Das Zuweisen von 5 oder eines beliebigen int-Werts anstelle von my_ptr
wird auch für diesen Funktionszeiger nicht kompiliert.
Was bedeutet die Aufgabe?
Update 1
Wir haben die Bestätigung, dass es sich um einen Fehler handelt, wie in der besten Antwort gezeigt. Es ist jedoch immer noch nicht bekannt, was tatsächlich mit dem Wert geschieht , den Sie dem Funktionszeiger zuweisen, oder was mit der Zuweisung geschieht. Alle (guten) Erklärungen dazu wären sehr dankbar! Weitere Informationen zum Problem finden Sie in den folgenden Änderungen.
Bearbeiten 1
Ich benutze gcc Version 4.8.2 (in Ubuntu 4.8.2)
Bearbeiten 2
Eigentlich funktioniert es auf meinem Compiler, es mit irgendetwas gleichzusetzen. Sogar das Gleichsetzen mit einer std :: string-Variablen oder einem Funktionsnamen, der ein Double zurückgibt, funktioniert.
Bearbeiten 2.1
Interessanterweise kann es kompiliert werden, wenn es zu einem Funktionszeiger auf eine Funktion gemacht wird, die einen Datentyp zurückgibt, der kein Zeiger ist, z
std::string (*) () = 5.6;
Sobald sich der Funktionszeiger jedoch auf eine Funktion bezieht, die einen Zeiger zurückgibt, wird er nicht kompiliert, z. B. mit
some_data_type ** (*) () = any_value;
error: expected identifier or '(' before ')' token
int *x = 5
dir hat es benannt x
. Damit int * (*x) (int *) = 5
wird nicht kompiliert. (obwohl das als C-Code kompiliert wird).
int(*) = 5;
undint(*);