5分でわかる プログラミング C++言語 ポインタとは
C++言語(C言語)を始めるにあたり、ポインタでつまづくという話は良く耳にすると思います。
しかし、ポインタなんて簡単です。コンピュータの仕組みをちょっとだけ理解すれば誰でも分かるようになります。ホントです。
目次
・ポインタの意味
・メモリの世界
・ポインタのメリット
・ポインタの使用例
ポインタの意味
ポインタを調べてみると、「変数が格納されているアドレスのこと」的な内容が出てくると思います。
コレが全てを表しているのですが、メモリへの理解が十分でないと、何を言っているのかわからないということになるのだと思います。
つまり、ポインタを理解するためには、まずメモリを理解する必要があるのです。
メモリの世界
メモリという言葉は殆どの方が聞いたことがあると思います。DDR3とか16GBとかのあのメモリのことです。
さて、プログラムは原則メモリの上で動きます。PCも、タブレットも、スマホも、ゲーム機も、アーキテクチャに違いはあれど、プログラム(ソフト)は必ずメモリ上で動きます。
そのプログラムに、例えば
int a;
という記述があった場合、メモリ上では「int a;」は下図のように展開されています。
メモリは図のように番地のような概念を持っています。変数aはメモリ空間上の「C2」というところに展開されているわけです。この「C2」こそ、変数aが格納されているアドレスなのです。
そして、このアドレスそのものにアクセスできるのがポインタなのです。
ポインタは変数型毎に定義してやる必要があります。今回はint型なので、アドレスにアクセスしたい場合は、int型へのポインタ型を定義します。
以下の様なコードを実行した場合、メモリ空間イメージは以下のようになります。
int a; int* ptr; // int型へのポインタを定義 ptr = &a; // 変数aが格納されているアドレス「C2」をポインタへ代入
ポインタのメリット
ここまで読み進めていただいた方が、次に抱える疑問はこうだと思います。
「それはわかったけど、なぜポインタを使わなきゃいけないの?」
結論からいうと、ポインタを使用するメリットは「処理の高速化」です。
int型の変数程度ならポインタを使用せずとも問題ありませんが、色々な型の変数をいくつも持つクラスを関数の引数に渡すような場合、全ての変数のコピーを行う必要があります。これはコンピュータにとってかなりの負荷になります。
しかし、そのクラスのポインタ型を宣言しておいて、ポインタでやりとりするようにすれば、引数渡しのコストはポインタをコピーするだけで済みます。これがポインタを使うメリットになります。
ポインタの使用例
最後にポインタのよく使われる具体的な例を示して終わりにしたいと思います。
例1
// 変数定義 初期化 int a; a = 2; // ポインタ定義 int* ptr; // 変数aが格納されているアドレス「C2」をポインタへ代入 ptr = &a; // printfの実行結果は2 ポインタの前に「*」をつけることで実体を参照することが可能 printf("%d", *ptr);
例2
// クラス定義 class Hito { string name; // 名前 int age; // 年齢 }; // ポインタ型のインスタンス生成 Hito* hito = new Hito(); // ポインタを辿って実体にアクセス hito->string = "Taro"; hito->age = 20; // 実体へのアクセスは下記のようにしても可能 (*hito).string = "Taro"; (*hito).age = 20;
アロー演算子「->」
ポインタの前に「*」をつけると、ポインタの指す変数の実体にアクセスできます。実体がクラスの場合は更に「.」でクラスの中のメンバにアクセスできます。
ただ、そのような書き方は非常に煩わしいので、「*」と「.」をアロー演算子「->」で代替することが可能です。
以上です。ここまでご覧頂き、ありがとうございました。