Оператор address-of: &

Синтаксис

address-of-expression:
& cast-expression

Замечания

Унарный оператор (&) возвращает адрес (то есть указатель на) его операнду. Операнд оператора address-of может быть конструктором функций или lvalue, который относится к объекту, который не является немного полем.

Оператор address-of может применяться только к определенным выражениям lvalue: к переменным фундаментальных, структур, классов или типов объединения или к подстрочных ссылок на массив. В этих выражениях можно добавить или вычесть константное выражение (не включающее адрес оператора).

При применении к функциям или lvalue результатом выражения является тип указателя (rvalue), производный от типа операнда. Например, если операнд имеет тип char, результат выражения имеет указатель charтипа. Адрес оператора, примененный к const объектам или volatile объектам, вычисляет const type * или volatile type *определяет type тип исходного объекта.

Адрес перегруженной функции можно принимать только в том случае, если она ясно, какая версия функции ссылается. Дополнительные сведения о том, как получить адрес конкретной перегруженной функции, см. в разделе "Перегрузка функции".

Если адрес оператора применяется к полному имени, результат зависит от того, указывает ли полное имя статического члена. Если да, то результатом является указатель на тип, заданный в определении этого члена. Для элемента, который не является статическим, результатом является указатель на имя члена класса, указанного квалифицированным именем класса. Дополнительные сведения о квалифицированном имени класса см. в разделе "Основные выражения".

Пример: адрес статического элемента

В следующем фрагменте кода показано, как отличается результат оператора адреса в зависимости от того, является ли элемент класса статическим:

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

В этом примере выражение &PTM::fValue имеет результатом тип float *, а не float PTM::*, поскольку fValue является статическим членом.

Пример: адрес ссылочного типа

Применение оператора взятия адреса к типу ссылки дает тот же результат, что и применение к объекту, к которому привязана ссылка. Например:

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

Пример: адрес функции в качестве параметра

В следующем примере оператор взятия адреса используется для того, чтобы передать указатель в качестве аргумента функции:

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

См. также

Выражения с унарными операторами
Встроенные операторы C++, приоритет и ассоциативность
Декларатор ссылки Lvalue: &
Косвенные и адресные операторы