richtigen Weg zu weisen Funktionszeiger
Ich bin ein wenig verwirrt über die richtige syntax für die Zuweisung einer Funktion den Zeiger auf eine
variable. Wenn ich eine Funktion foo
int foo();
und ich bin Zuweisung einen Zeiger auf variable foo auf bar
void * bar;
scheint es nicht egal ist, wenn ich
bar = foo;
//or
bar = &foo;
Scheint es mir, dass nur einer von diesen sollte richtig sein oder bin ich etwas fehlt?
- Okay, also Funktionszeiger sind ein besonderer Fall für die & - operator.
- Das ist interessant: stackoverflow.com/questions/840501/...
- Das ist interessant. Vielen Dank für Eure Hilfe, Jungs Sie.
Du musst angemeldet sein, um einen Kommentar abzugeben.
foo
und&foo
Werte sind äquivalent in C und haben den gleichen Typ.Den
&
Betreiber hier richtig ist aber überflüssig.Beachten Sie, dass die Zuweisung einer Funktion den Zeiger auf eine
void *
ist nicht gültig im C.(Diese sind eigentlich Erklärungen, aber die Einschränkungen der Zuweisungsoperator gelten.)
int (*fp2) = foo;
selbst kompiliert ..kein problem :)\-Werror
.int (*fp2) = foo;
ist eigentlich ungültig C.foo
und&foo
sind nicht gleichwertig und in der Regel nicht denselben Typ haben. Währendsizeof(&foo)
ist vollkommen gültig,sizeof(foo)
nicht. Sie denken vielleicht, Funktionen und Zeiger auf Sie in gleicher Weise, wie behandelst du arrays von etwas und die Zeiger auf die gleichen etwas. In den meisten Ausdruck Kontexten, arrays und Funktionen "Verfall" an den Pointer, der auf zwei Ausnahmen sein, wenn die unären Operatoren&
undsizeof
auf Sie angewendet.sizeof
Auswertung nicht seines Operanden.&(foo)
ist nicht das gleiche wie&(&foo)
haben, so dass ein anderer Kontext, in dem die beiden sind nicht gleichwertig. Ich nehme an, dass technisch&
nicht voll bei der Evaluierung der Operanden, da Sie es nicht tun, die Sache, die in C++ aufgerufen wird lvalue-rvalue-Konvertierung, und in C heißt das finden der Wert eines Ausdrucks, so nehme ich an, dass technisch in C lvalues sind nie "bewertet", da Sie nicht wirklich Werte. Das ist ein Recht feines Haar, split statt finden, eine andere Art zu sagen, was gesagt werden muß über den Ausdruckfoo
.Lassen Sie mich erklären, ein wenig mehr.
Dies ist nicht ganz korrekt, da zeigen auch die Kommentare zu der Antwort von @ouah. Vor allem:
sizeof(foo)
ungültig ist, undsizeof(&foo)
ist die Größe eines Zeigers.&foo
ist der Zeiger auf foo, während&(&foo)
ist ungültig.Jedoch, Sie sind eigentlich die gleichen wie in allen anderen Fällen, wie erwähnt, von der Norm von C (Referenz zu, z.B., die Entwurf von C11):
Den
sizeof
und unäre&
- Operatoren sind nur zwei Ausnahmen, wenn eine Funktion-Kennung umgewandelt in einen Zeiger.P. S. Sie können auch finden, warum
sizeof(foo)
und&(&foo)
ist ungültig: