この章ではポインタについて説明します。
「ポインタ」を理解するためにはコンピュータがどのようにデータを記憶しているかの理解が必要です。
変数の値をコンピュータが記憶する場合、そのデータはメモリ上に置かれます。
メモリとは, 1バイトの幅の区画がビルの階のように連続してつながっているものと思ってください。
例えば、ビルは下から順番に1,2…と階数が付けられますが、メモリも同じで「1バイトの幅の区画」に順番に「番号」が付けられています。
この番号を「アドレス」と言います。
このアドレスは例えば0026FDE8のような16進数で表します。
変数を記憶するには1バイトで済むとは限らず、型によっては何バイトも必要になることがあります。
変数の型によって、使うバイト数が決まると言うことです。
例えば2147483647と言う大きな整数を使用して4バイト分を使うとします。
この整数のアドレス(メモリ上で)はどこにあると思いますか?
実はこの整数のアドレスはその整数に割り当てられたアドレスの先頭のアドレスにあります。
結果をバイト単位で表します。
変数iはsizeof演算子で調べた結果、4バイトあることがわかります。
これを付けることによって、変数iの値がメモリのどこに記憶されているか知ることが出来ます。
「&」をアドレス演算子と言います。
このアドレスは使っているコンピュータによって違います。
例えば「0044FA6C」などと表示されます。
そして、そのアドレスを出力するためのprintf関数の変換指定文字は「%p」を使います。
もしくは「std::cout」を使って以下のように書いてもいいです。
ポインタとは変数のアドレスを記憶する特殊な変数のことです。
これをポインタ変数と言います。
つまり、アドレスを記憶するだけの変数を作ることが出来るのです。
ポインタ変数も普通の変数と同じく宣言しなくてはいけません。
そしてポインタの宣言をした後で、
以下のように宣言と初期化を一緒に書くこともできます。
以下のように書いても同じ意味です。
抽象的に言いますと、i君とgさんが同居することを意味していまして、gに起こった出来事はiに起こったことと同じ意味を持つようになります。
ですので一身同体のゆえ、次の5番ではポインタgからiの値を取り出しています。
つまり、iとgには同じアドレスが入っているので、「*g」と書くことでiに入っている値が取り出すことが出来ます。
この例の結果は2147483647となり、iの値と同じになります。
結果は「2147483600」になります。
次の章で具体的なポインタの使い方について説明します。