「参照、ポインター、配列」

ポインター

ポインターを理解するには、まずコンピューターが変数をメモリに格納する
方法を思い出すが良い。プログラムが関数に入ると、ローカル変数が自動的に割り当てられるが、
これはスタックと呼ばれるメモリ領域に置かれる。つまり、関数のローカル変数は、どれも、
C++プログラムが知っているメモリアドレスを持つ。
  表Aに、コードの断片と、変数がメモリに置かれる場所の例を示す。
それぞれの変数に、1つずつメモリアドレスが割り当てられることに注意しょう。
この表でメモリアドレスを16進数で示しているのは、これがメモリアドレスの古典的な表記だからだ。

表A 変数のストレージ


アドレス (adress-of) 演算子と呼ばれる&は、変数のアドレスを問い合わせる。
ある変数のアドレスを取得するには、その変数の直前に1個の&を置く。
例えば表Aのコードがある時次のコードは0xC234という値を出力する


ポインタ (pointer)は、メモリアドレスに対応する整数値を格納する変数である。
次の行は変数yのメモリアドレスを格納するポインタpっを宣言する。


型の直後にある*が、ポインタであることを示す。表Bに、ポインタpの用例を示す。
ここでは、他の変数と同じpがメモリアドレスと値の両方を持つことに注意しましょう。
ただしpはポインタなので、その値は変数yのメモリアドレスを対応する。

表B 変数とポインタのストレージ


*演算子は、ポインタの間接参照(deference)も行う。ポインタの間接参照は、
そのポインタが指し示すメモリにアクセスする。例えば表Cの最後の行は、yの値を42に変える。
なぜなら、pを間接参照すると、メモリアドレス0xC234が参照され、それがyメモリアドレス
に対応するからだ。したがって、そのアドレスのメモリに42という値を書けば、yの値が上書きされる。

表C 変数のストレージと関節参照


参照は何かを参照している必要があるが、ポインタは何も指し示さないことがある。何も指し示さない
ポインタは、ヌルポインタ(null pointer)です。ポインタをヌルで初期化するには、
次のコードのように、nullptrキーワードを使う。


ヌルポインタを間接参照すると、往路グラムはクラッシュする。エラーメッセージはOSによって異なるが、
ヌルポインタを間接参照した時に起きるエラーは、
「アクセス違反」か「セグメンテーションフォールトトレラント」が一般的。

【戻る】