アドレス演算子: と
& cast-expression
解説
アドレス演算子を単項演算子 () ではオペランドのアドレスです。アドレス演算子のオペランドは関数呼び出しまたはビット フィールドではなく 登録 " ストレージ クラスの指定子と宣言されていないオブジェクトを指定する左辺値を指定できます。
アドレス演算子のみ適用できますがファイルまたはスコープのレベルで宣言されたまたは構造体共用体型使用して基本クラスの変数に subscripted 配列への参照。これらの式ではアドレス演算子を含まない定数式がに追加されるかまたは式のアドレスを減ずることができます。
関数または左辺値に適用した場合式の結果はオペランドの型から派生した型のポインター (右辺値) です。たとえばオペランドが char 型である場合式の結果は char に型のポインターです。type が元のオブジェクト型であるか 定数 volatile のオブジェクトに適用されるアドレス演算子 定数 type***** または volatiletype***** になります。
アドレス演算子 修飾名 に適用された場合結果は 修飾名は 静的メンバーを指定するかによって異なります。その場合結果はメンバーの宣言で指定される型へのポインターです。メンバーが静的でない場合結果は 修飾クラス名 に示すクラスのメンバー名へのポインターです。( 修飾クラス 名の詳細については 主要な式 を参照してください)。次のコードはメンバーが静的かどうかを結果の違いによって示します :
// 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 PTM::* は型ではなく fValue は静的メンバーであるため float * を入力します。
オーバーロードされた関数のアドレスが関数のバージョンが参照されているかが明確な場合にのみ使用できます。特定のオーバーロードされた関数のアドレスを取得する方法についてはオーバーロードされた関数のアドレス を参照してください。
参照型にアドレス演算子を適用すると参照がバインドされているオブジェクトに示します。演算子を適用することと同じ結果を生成します。次に例を示します。
使用例
// 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