Address-of 演算子: &

構文

address-of-expression:
& cast-expression

注釈

単項アドレス演算子 (&) は、そのオペランドのアドレス (つまり、ポインター) を返します。 address-of 演算子のオペランドには、関数指定子またはビット フィールドではないオブジェクトを参照する左辺値を指定できます。

address-of 演算子は、特定の左辺値式 (基本型、構造体型、クラス型、共用体型の変数、または添字付き配列参照) にのみ適用できます。 これらの式では、定数式 (address-of 演算子を含まない式) を address-of 式に追加または減算できます。

関数または左辺値に適用すると、式の結果はオペランドの型から派生したポインター型 (右辺値) になります。 たとえば、オペランドが char型の場合、式の結果は charへの型ポインターになります。 constまたはvolatileオブジェクトに適用される address-of 演算子は、const type *またはvolatile type *に評価されます。ここで、typeは元のオブジェクトの型です。

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

address-of 演算子が修飾名に適用される場合、結果は修飾 が静的メンバーを指定するかどうかによって異なります。 その場合、結果はメンバーの宣言で指定された型へのポインターになります。 静的でないメンバーの場合、結果は修飾クラス名で示されるクラスのメンバー へのポインター になります修飾クラス名の詳細については、「プライマリ式」を参照してください。

例: 静的メンバーのアドレス

次のコード フラグメントは、クラス メンバーが静的かどうかに応じて、演算子のアドレスの結果がどのように異なるかを示しています。

// 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::fValuefValueが静的メンバーであるため、型float PTM::*の代わりに型float *が生成されます。

例: 参照型のアドレス

参照型に 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;
}
&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++ 組み込み演算子、優先順位、および結合規則
Lvalue 参照宣言子: &
間接演算子とアドレス演算子