第33章 ポインタ天国2

 ポインタはアドレスを格納する変数です。で、格納できました。しかし、このアドレスの使い道って何なのでしょうか? 今回はそこを少し話してみます。


 今回の要点は以下の通りです。


 では、いってみましょう。


 さて、前回ポインタに変数のアドレスを入れました。ですが、その後やったことといえば入れたアドレスを表示しただけでした。

 これだけしかできないのではポインタの使い道は皆無に近いです。しかし、ポインタは重要な役割を持っています。その役割はポインタという名前に示されています。

 ポインタといえば、黒板とかに書いてあることを指し示す棒とかレーザーのことですね。つまり、ポインタにはそのアドレスのメモリを指し示す能力があるのです

 むぅ、表現が難しくなってしまいましたね。もっと簡単にいうと、そのアドレスにある変数の代わりになるのです

 まぁ、いろいろ言うより実際に見てみましょう。

プログラム実行結果
// Ptr2.cpp
#include <iostream.h>

int main()
{
    int a;
    int* p = &a;

    a = 0;
    cout << " a = " <<  a << endl
         << "*p = " << *p << endl;

    *p = 5;
    cout << " a = " <<  a << endl
         << "*p = " << *p << endl;

    return 0;
}
 a = 0
*p = 0
 a = 5
*p = 5

 今度は int 型の変数のアドレスを入れることにします。なので、ポインタの型は int* になります。a のアドレスで初期化もしておきます。

 それでは、上で言ったことを実際に見てみましょう。ポインタ p には a のアドレスが入っているので、p をどうにかしたら a の代わりに使えるようになるわけです。では、どうするのでしょうか?

 これまた簡単です。p の前に * を付けるだけです。つまり、*p は a と同じになります。その証拠を見てみましょう。

 a に 0 を入れた後に a と *p をそれぞれ表示してみました。両方 0 になっています。

 では、今度は *p に 5 を代入してみましょう。すると、a の値も同じ 5 に変わりました。a と *p は同じものになるので当然の結果です。

 このように、ポインタを使って間接的に変数を扱うことを参照と言います。


 それでは、ポインタの定義部分を見て下さい。

int* p;

 初期化部分は省略しました。で、これは次のように書くこともできます。

int *p;
int * p;
int
*
p;

 つまり、* は間に入っていればあとはどうでもいいのです。そのうち、一番上のものを見て下さい。

int *p;

 これは *p という int 型の変数を定義しているようにも見えますね。*p は int 型になり、int 型の変数の代わりに使えるという雰囲気が出ていると思います。

 書き方のことを言ったのでついでに言いますが、一度に2個以上のポインタを定義するときは、

int *p, *q;

のように、全部に * を付けます。int *p; と書く人はあまり問題ありませんが、int* p; と書いている人は付け忘れがあったりすることがあります。ちなみに筆者は int* p; の方が好きです。


 さて、ポインタを使えば変数の複製を作ることができることがわかりました。しかし、変数などそのまま使えばいいじゃないか、と思うでしょう。ところがそうもいかない状況があるのです。それについてはまた次回にさせていただきます。

 では、今回の要点は次の通りでした。


 次回はポインタを引数に取る関数について話していきます。ではまた次回。


第32章 ポインタ天国 | 第34章 ポインタ天国3

Last update was done on 1999.3.31

この講座の著作権はロベールが保有しています