& (アドレス) 演算子は、そのオペランドを指すポインターを生成します。 オペランドは、左辺値、関数指定機能、または修飾名でなければなりません。オペランドは、ビット・フィールド であることも、ストレージ・クラス register を指定することもできません。
オペランドが左辺値または関数である場合は、結果の型は 式型を指すポインターです。例えば、式に型 int が指定されている場合、結果は、型 int が指定されたオブジェクトを指すポインターになります。
オペランドが修飾名で、メンバーが静的でない場合は、結果は、クラスのメンバーを 指すポインターになり、メンバーと同じ型になります。結果は、左辺値ではありません。
p_to_y が int を指すポインターとして定義され、 y が int として定義されている場合、 次の式では、変数 y のアドレスをポインター p_to_y に代入します。
p_to_y = &y;
アドレス演算子は、AltiVec 言語拡張機能が使用可能になっている場合に、ベクトル型を処理するために拡張されました。
ベクトル型に適用されたアドレス演算子の結果は、
互換性のあるベクトル型へのポインターに保管することができます。初期化の両側が互換性のある型を持
つ場合、ベクトル型のアドレスを、ベクトル型へのポインターを初期化するために使用することができます。
void へのポインターも、ベクトル型のアドレスで初期化することができます。
このセクションでのここから先の説明は、C++ だけに適用されます。
アンパーサンド記号 & は、C++ では、アドレス演算子としてばかりでなく、参照宣言子とし ても使用され ます。これらの意味は関連性がありますが、同じではありません。
int target; int &rTarg = target; // rTarg is a reference to an integer. // The reference is initialized to refer to target. void f(int*& p); // p is a reference to a pointer
これは、参照のアドレスを取得した場合にそのターゲットのアドレスを戻します。 直前の宣言を使用して、&rTarg は &target と同じメモリー・アドレスとなります。
レジスター変数のアドレスを取ることができます。
使用する多重定義関数のバージョンを、左側が固有に判別する初期化または代入の場合に限り 、多重定義関数で & 演算子を使用することができます。
ラベルのアドレスは、GNU C アドレス演算子 && を使用して取得することができます。これによりラベルを値として使用することができます。
関連参照