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