Compartilhar via


Operador Address-of: &

Sintaxe

address-of-expression:
& cast-expression

Comentários

O operador address-of unário (&) retorna o endereço de (ou seja, um ponteiro para) seu operando. O operando do operador endereço de pode ser um designador de função ou um lvalue que se refere um objeto que não é um campo de bits.

O operador address-of pode ser aplicado a determinadas expressões lvalue: seja a variáveis de tipos fundamentais, estrutura, classe ou união ou a referências de matriz subscritas. Nessas expressões, uma expressão constante (que não inclui o operador address-of) pode ser adicionada ou subtraída da expressão address-of.

Quando aplicado a funções ou lvalues, o resultado da expressão será um tipo de ponteiro (um rvalue) derivado do tipo do operando. Por exemplo, se o operando for do tipo char, o resultado da expressão será do tipo de ponteiro para char. O operador address-of, aplicado aos objetos const ou volatile, é avaliado em const type * ou volatile type *, em que type é o tipo do objeto original.

Você só poderá usar o endereço de uma função sobrecarregada quando estiver claro qual versão da função é referenciada. Para mais informações sobre como obter o endereço de uma função sobrecarregada específica, confira Sobrecarga de função.

Quando operador address-of é aplicado a um nome qualificado, o resultado depende de se o nome qualificado especifica um membro estático. Nesse caso, o resultado é um ponteiro para o tipo especificado na declaração do membro. Se o membro não for estático, o resultado será um ponteiro para o membro name da classe indicada por qualified-class-name. Para mais informações sobre qualified-class-name, confira Expressões primárias.

Exemplo: endereço do membro estático

O seguinte fragmento de código mostra como o resultado do operador address-of difere, dependendo de se o membro da classe é estático:

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

Neste exemplo, a expressão &PTM::fValue gera o tipo float * em vez do tipo float PTM::* porque fValue é um membro estático.

Exemplo: endereço de um tipo de referência

Aplicar o operador address-of a um tipo de referência fornece o mesmo resultado que aplicar o operador ao objeto ao qual a referência está associada. Por exemplo:

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

Exemplo: endereço da função como parâmetro

O exemplo a seguir usa o operador address-of para passar um argumento de ponteiro para uma função:

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

Confira também

Expressões com operadores unários
Operadores internos, precedência e associatividade no C++
Declarador de referência Lvalue: &
Indireção e endereço dos operadores