参照演算子と間接参照演算子
単項演算子:インデックス への移動
構文
& キャスト式 * キャスト式
解説
& 演算子と * 演算子は,それぞれ関数に渡される参照ポインタまたは間接参照ポインタとして機能します。
参照演算子(&)
参照演算子を使うと,main()
の外部の関数にポインタのアドレスを渡せます。
キャスト式のオペランドは以下のどちらかでなければなりません。
- 関数記述子
- ビットフィールドでなく,register 記憶クラス指定子で宣言されていない,オブジェクトを指す左辺値
オペランドが <型> 型であるとすると,結果は型への <型> ポインタになります。
関数名や配列名のように,左辺値ではない識別子がコンテキストに配置された場合,識別子は自動的に「X を指すポインタ」に変換されます。 このようなオブジェクトを & 演算子と併用することはできますが,冗長であるため避けてください。
以下の例を参考にしてください。
T t1 = 1, t2 = 2; T *ptr = &t1; // 初期化済みポインタ *ptr = t2; // t1 = t2 と同じ効果
T *ptr = &t1
は次のように扱われます。
T *ptr; ptr = &t1;
すなわち,代入を受けるのは ptr
であって,*ptr
ではありません。 一度 ptr
がアドレス &t1,
で初期化されていれば,ptr
を間接参照して安全に左辺値 *ptr を得ることができます。
間接参照演算子(*)
変数式でアスタリスク(*)を使うとポインタを作成できます。 外部関数で間接参照演算子を使うと,参照で渡されたポインタの値が得られます。
オペランドが関数へのポインタ型の場合,結果は関数記述子になります。
オペランドがオブジェクトへのポインタの場合,結果はそのオブジェクトを指す左辺値になります。
以下の場合,間接参照演算子の結果は未定義になります。
- キャスト式がヌルポインタ
- キャスト式が自動変数のアドレスで,そのブロックの実行が終了している
メモ: & はビットごとの AND 演算子としても使えます。
メモ: * は乗算演算子としても使えます。