Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Оператор 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: &
Косвенные и адресные операторы