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
Comentarios
https://aka.ms/ContentUserFeedback.
Próximamente: A lo largo de 2024 iremos eliminando gradualmente GitHub Issues como mecanismo de comentarios sobre el contenido y lo sustituiremos por un nuevo sistema de comentarios. Para más información, vea:Enviar y ver comentarios de