Ja, sie können sinnvoll verwendet werden: Ein gültiger Anwendungsfall ist in Makrodefinitionen, um zu überprüfen, ob das Makroargument den Anforderungen entspricht.
&*foo
überprüft, ob foo
ein Zeigertyp ist (möglicherweise nach einer impliziten Konvertierung aus einem Array oder einem Funktionstyp).
*&foo
überprüft, dass foo
ein lvalue-Ausdruck ist.
Zum Beispiel, ein Beispiel, so einfach, dass es ein bisschen Makro-Missbrauch sein könnte:
%Vor%Der einzige sinnvolle Grund dafür ist, den Ausdruck nicht mehr als lvalue zu behandeln.
Zitat C11
, Kapitel §6.5.3.2
Der unäre Operator
&
gibt die Adresse seines Operanden an. Wenn der Operand den Typ '' type '' hat, Das Ergebnis hat den Typ '' Zeiger auf den Typ '' . Wenn der Operand das Ergebnis eines unären*
Operators ist, Weder dieser Operator noch der Operator&
werden ausgewertet, und das Ergebnis ist so, als wären beide entfällt, außer dass die Einschränkungen für die Operatoren weiterhin gelten und das Ergebnis kein lvalue ist.
&*ptr
enthält einen Hinweis für den Compiler, dass ptr != NULL
(da sonst *ptr
ein undefiniertes Verhalten bedeuten würde).
*&
kann einfach das Ergebnis einer Wartungsänderung sein, bei der eine Hilfszeigervariable eliminiert wurde:
Einfaches Ersetzen im obigen Code ip
mit &x.i
führt zu Code, der eine solche Frage auf StackOverflow entstehen lässt:
Auf ähnliche Weise kann &*
durch eine Refactoring-Änderung eingeführt werden, die lvalue durch einen Zeiger ersetzt hat.
Vor dem Refactoring:
%Vor%Nach dem Extrahieren des Server-Setup-Codes in eine eigene Funktion:
%Vor%Tags und Links c dereference addressof unary-operator