korrekte Zuweisung des Funktionszeigers

8

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?

    
Richard Johnson 07.03.2013, 20:08
quelle

2 Antworten

6

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.

%Vor%

(Dies sind eigentlich Deklarationen, aber die Einschränkungen des Zuweisungsoperators gelten.)

    
ouah 07.03.2013, 20:10
quelle
1

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:

  1. sizeof(foo) ist ungültig und sizeof(&foo) ist die Größe eines Zeigers.
  2. &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.

    
Colliot 04.10.2017 20:46
quelle

Tags und Links