Compartilhar via


Endereço do operador: &

& cast-expression

Comentários

O operador unário adress-of (e) leva o endereço do seu operando.O operando do operador adress-of pode ser um designador de função ou um valor de l que designa um objeto que não é um campo de bits e não é declarado com o registrar o especificador de classe de armazenamento.

O operador adress-of só pode ser aplicado às variáveis com fundamental, estrutura, classe, ou união tipos declarados no nível do escopo do arquivo ou para subscripted referências de matriz.Nessas expressões, uma expressão de constante não inclui o operador adress-of pode ser adicionada ao ou subtraída da expressão de endereço.

Quando aplicado a funções ou valores de l, o resultado da expressão é um tipo de ponteiro (um r-value) derivado do tipo do operando.Por exemplo, se o operando for do tipo char, o resultado da expressão é do ponteiro de tipo para char.O operador adress-of, aplicado a const ou volatile objetos, que é avaliada como consttype***** ou volatiletype*****, onde type é o tipo do objeto original.    

Quando o operador adress-of é aplicado a uma nome qualificado, o resultado depende se a 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 é um ponteiro para o membro nome da classe indicada por nome de classe qualificado.(Consulte Expressões primárias para obter mais informações sobre nome de classe qualificado.) O fragmento de código a seguir mostra como o resultado difere dependendo se o membro é 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 produz o tipo de float * em vez do tipo float PTM::* porque fValue é um membro estático.

O endereço de uma função sobrecarregada pode ser retirado apenas quando está claro qual versão da função está sendo referenciada.Consulte Endereço de funções sobrecarregadas para obter informações sobre como obter o endereço de uma determinada função de sobrecarregado.

Aplicando o operador adress-of a um tipo de referência fornece o mesmo resultado que aplicar o operador para o objeto ao qual a referência está acoplada.Por exemplo:

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

Saída

&d equals &rd

O exemplo a seguir usa o operador adress-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
}

Saída

25

Consulte também

Referência

Expressões com operadores unários

Operadores do C++

Precedência e associatividade de operadores

Declarador de referência lvalue: &

Conceitos

Indireção e operadores de endereço