アドレス取得演算子: &

構文

address-of-expression:
& cast-expression

解説

単項アドレス取得演算子 (&) を使用すると、そのオペランドのアドレス (つまり、ポインター) が返されます。 アドレス取得演算子のオペランドは、関数指定子またはビット フィールドではないオブジェクトを指定する lvalue を指定できます。

アドレス取得演算子は、特定の lvalue 式 (基本、構造体、クラス、または共用体の型を持つ変数、または添字配列参照のいずれか) だけに適用できます。 これらの式では、定数式 (アドレス取得演算子を含まないもの) を、アドレス取得式に加算したり、アドレス取得式から減算したりすることができます。

関数または lvalue に適用されたときの式の結果は、オペランドの型から派生したポインター型 (rvalue) です。 たとえば、オペランドが char 型の場合、式の結果は char へのポインター型になります。 const または volatile オブジェクトに適用されるアドレス取得演算子は、const type * または volatile type * (type は元のオブジェクトの型) と評価されます。

オーバーロード関数のアドレスは、どのバージョンの関数が参照されているかが明らかな場合にのみ受け取ることができます。 特定のオーバーロード関数のアドレスを取得する方法については、「関数のオーバーロード」をご覧ください。

アドレス取得演算子を修飾名に適用した場合、結果は qualified-name が静的メンバーを指定しているかどうかに依存します。 その場合、結果はメンバーの宣言で指定した型へのポインターです。 メンバーが静的でない場合、結果は qualified-class-name で示されるクラスのメンバーの名前へのポインターになります。 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

例: パラメーターとしての関数アドレス

次の例は、関数へのポインター引数を受け渡すためにアドレス演算子を使用します。

// 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 参照宣言子: &
間接演算子とアドレス演算子