Udostępnij za pośrednictwem


Operator Address-of: &

& cast-expression

Uwagi

Jednoargumentowy operator address-of (&) przyjmuje adres jego operandu.Operand operatora address-of może być w określeniem funkcji lub l wartością, która określa obiekt, który nie jest polem bitowym i nie został zadeklarowany z użyciem specyfikatora klasy magazynowej register.

Operator address-of można stosować tylko do zmiennych o typie podstawowym, do struktury, klasy, lub unii, które zostały zadeklarowane na poziomie pliku lub do indeksowanych odwołań do tablic.W tych wyrażeniach wyrażenie stałe, które nie zawiera operatora address-of można być dodane lub odjęte od wyrażenia address-of.

Po zastosowaniu do funkcji lub wartości l, wynikiem wyrażenia jest typ wskaźnika (wartość r) dziedziczący po typie operandu.Na przykład, jeśli argument jest typu char, wynikiem wyrażenia jest wskaźnik typu char.Operator adress-of zastosowany do obiektów const lub volatile, daje w wyniku consttype***** lub volatile type *, gdzie type jest typem obiektu oryginalnego.    

Kiedy operator address-of jest stosowany do nazwy kwalifikowanej, wynik zależy od tego, czy nazwa kwalifikowana określa członka statycznego.Jeśli tak, to wynik jest wskaźnikiem do typu określonego w deklaracji członka.Jeśli element członkowski nie jest statyczny, wynik jest wskaźnikiem do nazwy członka klasy wskazanej przez kwalifikowaną nazwę klasy. (Zobacz Wyrażenia podstawowe aby uzyskać więcej informacji o kwalifikowanej nazwie klasy.) Poniższy fragment kodu przedstawia, jak wyniki różnią się w zależności od tego, czy element członkowski jest statyczny:

// 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 daje typ float * zamiast typu float PTM::* bo fValue to statyczny element członkowski.

Adres przeciążonej funkcji może być użyty tylko wtedy, gdy jest jasne która wersja funkcji jest wywoływana.Zobacz Adres przeciążonej funkcji aby uzyskać informacje dotyczące sposobu uzyskiwania adresu określonej przeciążonej funkcji.

Zastosowanie operatora address-of z typem referencyjnym daje taki sam wynik jak zastosowanie operatora do obiektu, z którym powiązane jest odwołanie.Na przykład:

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

Dane wyjściowe

&d equals &rd

W poniższym przykładzie użyto operatora address-of do przekazania argumentu w postaci 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
}

Dane wyjściowe

25

Zobacz też

Informacje

Wyrażenia z operatorami jednoargumentowymi

Operatory języka C++

Operatory, pierwszeństwo i kojarzenie języka C++

Deklarator odwołania do wartości L: &

Koncepcje

Operatory pośrednie i „Address-of”