Adresa operátoru: &

& cast-expression

Poznámky

Unární operátor adresa (&) přebírá adresu svého operandu.Operand operátoru adresa může být označením funkce nebo l-hodnotou označující objekt, který se nachází mimo bitové pole a který není deklarován specifikátorem třídy úložiště register.

Operátor adresa lze použít pouze pro proměnné základních typů, struktur, tříd nebo sjednocení deklarovaných na úrovni oboru souboru nebo na indexované reference polí.V těchto výrazech lze konstantní výraz, který neobsahuje operátor adresa, přičíst nebo odečíst od výrazu adresy.

Při použití u funkcí nebo l-hodnot je výsledkem výrazu typ ukazatele (r-hodnota) odvozená od typu operandu.Je-li operand například typu char, je výsledek výrazu typu ukazatele na typ char.Operátor adresa použitý u objektů const nebo volatile je vyhodnocen jako const type * nebo volatile type *, kde type je typ původního objektu.

Je-li operátor adresa použit u kvalifikovaného názvu, výsledek závisí na tom, zda kvalifikovaný název určuje statický člen.Pokud ano, je výsledkem ukazatel na typ určený v deklaraci členu.Není-li člen statický, je výsledkem ukazatel na název členu třídy dané kvalifikovaným názvem třídy. (Další informace o kvalifikovaných názvech tříd naleznete v tématu Primární výrazy.) Následující část kódu ukazuje, jak se výsledky liší v závislosti na tom, zda je člen statický:

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

V tomto příkladu je výraz &PTM::fValue vyhodnocen na typ float * namísto typu float PTM::*, protože člen fValue je statický.

Adresu přetížené funkce lze získat pouze v případě, že je jasné, která verze funkce je odkazována.Informace o způsobu získání adresy konkrétní přetížené funkce naleznete v tématu Adresa přetížených funkcí.

Použití operátoru adresa u typu reference dává stejný výsledek jako použití operátoru u objektu, s nímž je reference svázána.Příklad:

Příklad

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

Výsledek

&d equals &rd

Následující příklad používá operátor adresa k předání argumentu ukazatele funkci:

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

Výsledek

25

Viz také

Referenční dokumentace

Výrazy s unárními operátory

Operátory jazyka C++

Operátory C++, priorita a asociativita

Deklarátor odkazu Lvalue: &

Koncepty

Deferenční operátory a operátory adresy