Adresse des Operators: &

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 (ein Ausdruck, der die Adresse des Operators nicht enthält) der Adresse des Ausdrucks hinzugefügt oder subtrahiert werden.

Bei Anwendung auf Funktionen oder lvalues ist das Ergebnis des Ausdrucks ein Zeigertyp (ein Wert), der vom Typ des Operanden abgeleitet ist. Wenn der Operand z. B. vom Typ charist, ist das Ergebnis des Ausdrucks vom Typ Zeiger auf char. Die Adresse des Operators, der auf const Objekte angewendet oder volatile angewendet wird, wird ausgewertet 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 die Adresse des Operators auf einen qualifizierten Namen angewendet wird, hängt das Ergebnis davon ab, ob der qualifizierte Name ein statisches Element angibt. Wenn dies der Fall ist, ist das Ergebnis ein Zeiger auf den Typ, der in der Deklaration des Members angegeben wird. Für ein Element, das nicht statisch ist, ist das Ergebnis ein Zeiger auf den Membernamen der Klasse, die durch qualifizierten Klassennamen angegeben ist. Weitere Informationen zu qualifiziertem Klassennamen finden Sie unter "Primä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. 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

Siehe auch

Ausdrücke mit unären Operatoren
Integrierte C++-Operatoren, Rangfolge und Zuordnung
Lvalue-Referenz-Deklarator: &
Dereferenzierung und Adressierung von Operatoren