Operador address-of: &

Sintaxis

address-of-expression:
& cast-expression

Comentarios

El operador unario address-of (&) devuelve la dirección de (es decir, un puntero a) su operando. El operando del operador address-of puede ser un designador de función de un lvalue que se refiere a un objeto que no es un campo de bit.

El operador address-of solo se puede aplicar a ciertas expresiones lvalue: ya sea variables de tipo fundamental, de estructura, de clase o de unión, o a referencias de matriz de subíndice. En estas expresiones, se puede agregar o quitar de la expresión address-of una expresión constante (una que no incluya el operador address-of).

Cuando se aplica a funciones o lvalues, el resultado de la expresión es un tipo de puntero (un rvalue) derivado del tipo del operando. Por ejemplo, si el operando es de tipo char, el resultado de la expresión es de tipo puntero a char. El operador address-of, aplicado a objetos const o volatile, se evalúa como const type * o volatile type *, donde type es el tipo del objeto original.

La dirección de una función sobrecargada se puede tomar solo cuando está claro a qué versión de la función se hace referencia. Para más información sobre cómo obtener la dirección de una función sobrecargada concreta, consulte Sobrecarga de funciones.

Cuando el operador address-of se aplica a un nombre calificado, el resultado depende de si el qualified-name especifica un miembro estático. En ese caso, el resultado es un puntero al tipo especificado en la declaración del miembro. Si un miembro no es estático, el resultado es un puntero al miembro name de la clase que se indica mediante qualified-class-name. Para obtener más información sobre qualified-class-name, consulte Expresiones principales.

Ejemplo: dirección del miembro estático

En el fragmento de código siguiente se muestra cómo difiere el resultado del operador address-of,en función de si el miembro de clase es 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
}

En este ejemplo, la expresión &PTM::fValue proporciona el tipo float * en lugar de float PTM::*, porque fValue es un miembro estático.

Ejemplo: dirección de un tipo de referencia

Al aplicar el operator address-of a un tipo de referencia se obtiene el mismo resultado que al aplicar el operador al objeto al que se enlaza la referencia. Por ejemplo:

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

Ejemplo: dirección de función como parámetro

En el ejemplo siguiente se usa el operator address-of para pasar un argumento de puntero a una función:

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

Consulte también

Expresiones con operadores unarios
Operadores integrados de C++, precedencia y asociatividad
Declarador de referencia a un lvalue: &
Direccionamiento indirecto y direccionamiento de operadores