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