文法
& 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 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
}
在此示例中,由于 fValue 是靜态成員,是以表達式 &PTM::fValue 産生類型 float * 而不是類型 float PTM::*。
僅當明确要引用的函數的版本時,才能采用重載函數的位址。有關如何擷取特定重載函數的位址的資訊,請參閱重載函數的位址。
通過将 address-of 運算符應用于引用類型,可獲得與将該運算符應用于引用綁定到的對象所獲得的結果相同的結果。例如:
// expre_Address_Of_Operator2.cpp
// compile with: /EHsc
#include
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
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
}
Output
25