語法
& cast-expression
備注
一元 address-of 運算符 (&) 采用其操作數的地址。address-of 運算符的操作數可以是函數指示符,也可以是指定不是位域且不使用 register 儲存類說明符聲明的對象的左值。
address-of 運算符僅適用于具有基本、結構、類或在文件范圍級別聲明的聯合類型的變量,或僅適用于下標數組引用。在這些表達式中,可在 address-of 表達式中添加或提取不包括 address-of 運算符的常數表達式。
當應用于函數或左值時,該表達式的結果將是派生自操作數類型(右值)的指針類型。例如,如果操作數的類型為 char,則表達式的結果為指向 char 的類型指針。address-of 運算符(應用于 const 或 volatile 對象)的計算結果為 const type * 或 volatile type *,其中 type 是原始對象的類型。
在將 address-of 運算符應用于限定名時,結果將取決于 qualified-name 是否指定靜態成員。如果是這樣,則結果為指向成員聲明中指定的類型的指針。如果該成員不是靜態的,則結果為指向由 qualified-class-name 指示的類的成員 name 的指針。
以下代碼段說明了結果的不同之處,取決于該成員是否為靜態的:
// expre_Address_Of_Operator.cpp// C2440 expectedclass 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}
在此示例中,由于 fValue 是靜態成員,因此表達式 &PTM::fValue 產生類型 float * 而不是類型 float PTM::*。
僅當明確要引用的函數的版本時,才能采用重載函數的地址。有關如何獲取特定重載函數的地址的信息,請參閱重載函數的地址。
通過將 address-of 運算符應用于引用類型,可獲得與將該運算符應用于引用綁定到的對象所獲得的結果相同的結果。例如:
// 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;}
Output
&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 intint square( int *n ) { return (*n) * (*n);}int main() { int mynum = 5; cout << square( &mynum ) << endl; // pass address of int}
Output
25