本記事執筆の背景
最近,C++使うことになったため。
理解が足りなくて苦しいので知識の整理を兼ねて書きます。
※ 内容にはいt
ポインタとは
ポインタとは,なんらかのオブジェクトを指し,オブジェクトを間接的に参照するためのものである。
僕のC言語の理解では,データのアドレスを入れるものという理解だったけど,C++のクラスを理解する上ではこちらのほうがわかりやすいですね。ポインタは以下のようにして,使用します。
char x;
char *ptr = &x;
char *ptr
でポインタを宣言し, &x
でxのアドレスを代入しています。
ポインタの利点
ポインタの利点がいまいち理解できてませんでしたが,
ポインタは移動可能
ということで,ポインタは移動して使用することで旨味が出てきます。
参考文献[1]では会社を例にしています。非常にわかりやすい!!
例えば,自分が社員数10名の会社の社長だとします。
社員全員に伝えたい命令がありますが,全ての社員を一人ずつ呼んで複雑な命令を伝えるわけにもいかないという状況。このとき,中間管理職の課長がいればどうでしょうか。社長は直接社員一人ひとりに命令を伝える必要はなく,課長に命令を伝え,課長を経由して間接的に社員全員に命令を下すことができます。
この,社員を一人ずつ呼んで間接的に命令を伝えてくれる課長の役割をするのがポインタです。
具体的にどういうことかというと,以下の様なことが出来るということです。
int x, y;
int *ptr = &x; // ptrはxを指す
*ptr = 1; // xに1を代入
ptr = &y; // ptrはyを指す
*ptr = 20; // yに20を代入
ちなみに,ポインタが配列の要素を指しているとき,ポインタを+1すると次の要素に移動できます。
char v[5];
char *p = &v[0]; // pはv[0]を指す
*p = 12; // v[0]に12を代入
++ptr; // ポインタはv[1]を指す
*ptr = 30; // v[1]に30を代入
こんな感じで,ポインタは指している先を変更できるので,異なるオブジェクトに対する処理をひとつのコードで記述できるのが便利なのです。
ポインタとクラス
構造体・クラス名を T とすると,
T *p = new T;
でクラスオブジェクトを生成することが出来ます。 オブジェクトを作って,ポインタで参照するんですね!
ちなみに単に
T obj;
と記述すると,現在のスコープ内で,構造体やクラスオブジェクトが生成されます。
オブジェクト生成時には,デフォルトコンストラクタが呼ばれ,ポインタが指す先の構造体・クラスのデータメンバはp->メンバ名
で参照できます。他にも,(*p).メンバ名
で参照することも可能です。
p = new T;
で生成したオブジェクトを破棄する場合は,delete p;
と書きます。 (← この辺りも勉強が必要)
まとめ
ポインタへの認識を,
データのアドレスを表すもの
=> オブジェクトを間接的に参照するためのもの
と変えると,C++のクラスにおけるポインタの使い方が理解しやすいことがわかりました。
引き続き勉強を続けます。