Оператор 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: &
Косвенные и адресные операторы
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по