Freigeben über


Adressoperator: &

Syntax

address-of-expression:
& cast-expression

Hinweise

Der unäre Operator (&) gibt die Adresse des Operanden (d. h. einen Zeiger auf) zurück. Der Operand des Operatoradressen kann ein Funktionsdesignator oder ein Wert sein, der sich auf ein Objekt bezieht, das kein Bitfeld ist.

Die Adresse des Operators kann nur auf bestimmte lvalue-Ausdrücke angewendet werden: entweder auf Variablen von grundlegenden, Struktur-, Klassen- oder Union-Typen oder auf tiefgestellte Arrayverweise. In diesen Ausdrücken kann ein konstanter Ausdruck, der nicht den address-of-Operator einschließt, dem address-of-Ausdruck hinzugefügt oder von diesem subtrahiert werden.

Bei Anwendung auf Funktionen oder L-Werte ist das Ergebnis des Ausdrucks ein Zeigertyp (ein R-Wert), der vom Typ des Operanden abgeleitet wird. Wenn beispielsweise der Operand vom Typ char ist, ist das Ergebnis des Ausdrucks ein Typzeiger auf char. Der address-of-Operator, der auf const oder volatile-Objekte angewendet wird, hat den Wert const type * oder volatile type *, wobei type der Typ des ursprünglichen Objekts ist.

Sie können die Adresse einer überladenen Funktion nur übernehmen, wenn klar ist, auf welche Version der Funktion verwiesen wird. Weitere Informationen zum Abrufen der Adresse einer bestimmten überladenen Funktion finden Sie unter Funktionsüberladung.

Wenn der address-of Operator auf einen qualifizierten Namen angewendet wird, hängt das Ergebnis davon ab, ob qualified-name einen statischen Member angibt. Wenn dies der Fall ist, ist das Ergebnis ein Zeiger auf den Typ, der in der Deklaration des Members angegeben wird. Für einen Member, der nicht statisch ist, ist das Ergebnis ein Zeiger auf den Member name der Klasse, die von qualified-class-name angegeben wird. Weitere Informationen zu qualified-class-name finden Sie unterPrimäre Ausdrücke.

Beispiel: Adresse des statischen Elements

Das folgende Codefragment zeigt, wie sich das Adress-of-Operator-Ergebnis unterscheidet, je nachdem, ob ein Klassenelement statisch ist:

// expre_Address_Of_Operator.cpp
// C2440 expected
class PTM {
public:
    int iValue;
    static float fValue;
};

int main() {
   int   PTM::*piValue = &PTM::iValue;  // OK: non-static
   float PTM::*pfValue = &PTM::fValue;  // C2440 error: static
   float *spfValue     = &PTM::fValue;  // OK
}

In diesem Beispiel ergibt der Ausdruck &PTM::fValue den Typ float * anstelle von Typ float PTM::*, da fValue ein statischer Member ist.

Beispiel: Adresse eines Referenztyps

Die Anwendung des address-of-Operators auf einen Referenztyp führt zum gleichen Ergebnis wie die Anwendung des Operators auf das Objekt, an das der Verweis gebunden ist. Zum Beispiel:

// expre_Address_Of_Operator2.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
int main() {
   double d;        // Define an object of type double.
   double& rd = d;  // Define a reference to the object.

   // Obtain and compare their addresses
   if( &d == &rd )
      cout << "&d equals &rd" << endl;
}
&d equals &rd

Beispiel: Funktionsadresse als Parameter

Im folgenden Beispiel wird der address-of-Operator benutzt, um ein Zeigerargument an eine Funktion zu übergeben:

// expre_Address_Of_Operator3.cpp
// compile with: /EHsc
// Demonstrate address-of operator &

#include <iostream>
using namespace std;

// Function argument is pointer to type int
int square( int *n ) {
   return (*n) * (*n);
}

int main() {
   int mynum = 5;
   cout << square( &mynum ) << endl;   // pass address of int
}
25

Weitere Informationen

Ausdrücke mit unären Operatoren
In C++ integrierte Operatoren, Rangfolge und Assoziativität
Lvalue-Verweisdeklarator: &
Dereferenzierungs- und Address-of-Operatoren