Operator address-of: &

Składnia

address-of-expression:
& cast-expression

Uwagi

Jednoargumentowy operator& () zwraca adres (czyli wskaźnik) jego operand. Operand operatora address-of może być projektantem funkcji lub wartością lvalue odwołującą się do obiektu, który nie jest polem bitowym.

Operator address-of może być stosowany tylko do niektórych wyrażeń lvalue: do zmiennych podstawowych, struktury, klas lub typów unii albo do odwołań do tablicy w indeksie dolnym. W tych wyrażeniach można dodać wyrażenie stałe (które nie zawiera operatora address-of) lub odjąć je od wyrażenia address-of.

W przypadku zastosowania do funkcji lub wartości l wynik wyrażenia jest typem wskaźnika (rvalue) pochodzącym z typu operandu. Jeśli na przykład operand ma typ char, wynik wyrażenia jest wskaźnikiem typu .char Operator address-of, zastosowany do const obiektów lub volatile , daje wartość lub const type *volatile type *, gdzie type jest typem oryginalnego obiektu.

Adres przeciążonej funkcji można pobrać tylko wtedy, gdy jest jasne, do której wersji funkcji odwołuje się odwołanie. Aby uzyskać więcej informacji na temat uzyskiwania adresu konkretnej przeciążonej funkcji, zobacz Przeciążanie funkcji.

Po zastosowaniu operatora address-of do kwalifikowanej nazwy wynik zależy od tego, czy kwalifikowana nazwa określa statyczny element członkowski. Jeśli tak, wynik jest wskaźnikiem do typu określonego w deklaracji elementu członkowskiego. W przypadku elementu członkowskiego, który nie jest statyczny, wynik jest wskaźnikiem do nazwy składowej klasy wskazanej przez kwalifikowaną nazwę klasy. Aby uzyskać więcej informacji na temat kwalifikowanej nazwy klasy, zobacz Wyrażenia podstawowe.

Przykład: adres statycznego elementu członkowskiego

Poniższy fragment kodu pokazuje, jak wynik operatora address-of różni się w zależności od tego, czy składowa klasy jest statyczna:

// 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
}

W tym przykładzie wyrażenie &PTM::fValue zwraca typ float * zamiast typu float PTM::* , ponieważ fValue jest statycznym elementem członkowskim.

Przykład: adres typu odwołania

Zastosowanie operatora address-of do typu odwołania daje taki sam wynik, jak zastosowanie operatora do obiektu, do którego odwołanie jest powiązane. Przykład:

// 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

Przykład: Adres funkcji jako parametr

W poniższym przykładzie użyto operatora address-of, aby przekazać argument wskaźnika do funkcji:

// 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

Zobacz też

Wyrażenia z operatorami jednoargumentowymi
Wbudowane operatory, pierwszeństwo i kojarzenie języka C++
Deklarator odwołań Lvalue: &
Operatory pośrednie i adresowe