讲解C++编程中Address-of运算符&的作用及用法
语法
&cast-expression
备注
一元address-of运算符(&)采用其操作数的地址。address-of运算符的操作数可以是函数指示符,也可以是指定不是位域且不使用register储存类说明符声明的对象的左值。
address-of运算符仅适用于具有基本、结构、类或在文件范围级别声明的联合类型的变量,或仅适用于下标数组引用。在这些表达式中,可在address-of表达式中添加或提取不包括address-of运算符的常数表达式。
当应用于函数或左值时,该表达式的结果将是派生自操作数类型(右值)的指针类型。例如,如果操作数的类型为char,则表达式的结果为指向char的类型指针。address-of运算符(应用于const或volatile对象)的计算结果为consttype*或volatiletype*,其中type是原始对象的类型。
在将address-of运算符应用于限定名时,结果将取决于qualified-name是否指定静态成员。如果是这样,则结果为指向成员声明中指定的类型的指针。如果该成员不是静态的,则结果为指向由qualified-class-name指示的类的成员name的指针。
以下代码段说明了结果的不同之处,取决于该成员是否为静态的:
//expre_Address_Of_Operator.cpp //C2440expected classPTM{ public: intiValue; staticfloatfValue; }; intmain(){ intPTM::*piValue=&PTM::iValue;//OK:non-static floatPTM::*pfValue=&PTM::fValue;//C2440error:static float*spfValue=&PTM::fValue;//OK }
在此示例中,由于fValue是静态成员,因此表达式&PTM::fValue产生类型float*而不是类型floatPTM::*。
仅当明确要引用的函数的版本时,才能采用重载函数的地址。有关如何获取特定重载函数的地址的信息,请参阅重载函数的地址。
通过将address-of运算符应用于引用类型,可获得与将该运算符应用于引用绑定到的对象所获得的结果相同的结果。例如:
//expre_Address_Of_Operator2.cpp //compilewith:/EHsc #include<iostream> usingnamespacestd; intmain(){ doubled;//Defineanobjectoftypedouble. double&rd=d;//Defineareferencetotheobject. //Obtainandcomparetheiraddresses if(&d==&rd) cout<<"&dequals&rd"<<endl; }
Output
&dequals&rd
以下示例使用address-of运算符将指针参数传递给函数:
//expre_Address_Of_Operator3.cpp //compilewith:/EHsc //Demonstrateaddress-ofoperator& #include<iostream> usingnamespacestd; //Functionargumentispointertotypeint intsquare(int*n){ return(*n)*(*n); } intmain(){ intmynum=5; cout<<square(&mynum)<<endl;//passaddressofint }
Output
25