Ich bin etwas verwirrt über die korrekte Syntax für die Zuordnung eines Funktionszeigers zu a Variable. Wenn ich eine Funktion foo
habe %Vor%und ich lege einen Zeiger auf foo auf den variablen Balken
%Vor%es scheint nicht wichtig zu sein, wenn ich
benutze %Vor%Es scheint mir, dass nur eine davon korrekt sein sollte oder fehlt mir etwas?
foo
und &foo
Werte sind in C gleich und haben den gleichen Typ.
Der Operator &
ist korrekt, aber redundant.
Beachten Sie, dass die Zuweisung eines Funktionszeigers zu void *
in C nicht zulässig ist.
(Dies sind eigentlich Deklarationen, aber die Einschränkungen des Zuweisungsoperators gelten.)
Lassen Sie mich ein wenig mehr erklären.
foo und & amp; foo Werte sind äquivalent in C und haben den gleichen Typ.
Dies ist nicht vollständig korrekt, wie in den Kommentaren zu der Antwort von @ouah ausgeführt. Besonders:
sizeof(foo)
ist ungültig und sizeof(&foo)
ist die Größe eines Zeigers. &foo
ist der Zeiger auf foo, während &(&foo)
ungültig ist. Sie sind jedoch in allen anderen Fällen die gleichen, wie der Standard von C (z. B. der Entwurf von C11 ):
6.3.2.1.4: Ein Funktionsbezeichner ist ein Ausdruck mit einem Funktionstyp. Außer wenn es der Operand der Größe des Operators oder des unären & amp; operator, Ein Funktionsbezeichner mit dem Typ "function returning type" wird in einen Ausdruck konvertiert, der den Typ "pointer to function returning type" hat.
Die Operatoren sizeof
und unary &
sind die einzigen beiden Ausnahmen, wenn ein Funktionsbezeichner nicht in einen Zeiger konvertiert wird.
P.S. Sie können auch herausfinden, warum sizeof(foo)
und &(&foo)
ungültig ist:
6.5.3.2.1: Der Operand des unären
&
Operators muss entweder ein Funktionsbezeichner, das Ergebnis eines[]
oder unary*
Operators, oder ein lvalue sein, der ein Objekt bezeichnet, das kein a ist Bit-Feld und wird nicht mit dem Register Storage-Class-Specifier deklariert.6.5.3.4.1 Der Operator
sizeof
darf nicht auf einen Ausdruck angewendet werden, der den Funktionstyp oder einen unvollständigen Typ hat, auf den eingeklammerten Namen eines solchen Typs oder auf einen Ausdruck, der bezeichnet ein Bitfeldelement.
Tags und Links c function-pointers