地址运算符: &

语法

address-of-expression:
  & cast-expression

注解

一元地址运算符 (&) 返回其作数(即指向)作数的地址。 地址运算符的作数可以是函数设计符,也可以是引用非位字段的对象的左值。

地址运算符只能应用于某些左值表达式:无论是基本、结构、类或联合类型的变量,还是应用于下标数组引用。 在这些表达式中,可以将常量表达式(不包括运算符的常量表达式)添加到或减去表达式的地址。

应用于函数或左值时,表达式的结果是派生自作数类型的指针类型(右值)。 例如,如果作数的类型 char,则表达式的结果是指向 char的类型指针。 应用于 const 或 volatile 对象的地址运算符的计算 const type * 结果为原始 volatile type *对象的类型或计算 type 结果。

仅当明确引用哪个版本的函数时,才能获取重载函数的地址。 有关如何获取特定重载函数的地址的详细信息,请参阅 函数重载。

当地址运算符应用于限定名称时,结果取决于 限定名称 是否指定静态成员。 如果是这样,则结果是指向成员声明中指定的类型的指针。 对于非静态成员,结果是指向由 qualified-class-name 指示的类的成员名称的指针。 有关 限定类名称的详细信息,请参阅 主表达式。

示例:静态成员的地址

以下代码片段显示了运算符地址结果的不同之处,具体取决于类成员是否为静态:

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

示例:函数地址作为参数

以下示例使用 address-of 运算符将指针参数传递给函数:

// 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++内置运算符、优先级和关联性
左值引用声明符: &
间接运算符和地址运算符