そろそろC++やります
そろそろC++をやります。そろそろC++をやりたいからです。
何回やるかはわかりません。基礎を理解するまではやろうと思います。
という感じでやっています。
※ 初心者がメモレベルで記録するので、技術記事としてはお力になれないかもしれません。
内容
ポインター
ポインターはメモリのアドレスを格納する変数です。
int a = 123; int *intPtr = &a:
この場合intPtr
の変数がポインターです。
以下がCとC++の主要な3つの使用目的です。
- ヒープ上に新しいオブジェクトを割り当てる。
- 関数を他の関数に渡す。
- 配列またはその他のデータ構造内の要素を反復処理する。
1は以前に登場したnew
での割り当てです。
int *intPtr; intPtr = new int;
C言語では、生ポインターが使われており、エラーの原因となっており、C++では非推奨です。
最新の C++ では、
が使用されます。
これらについてこれから数回かけて触れています。
生ポインター
生ポインターは、スマート ポインターなど、カプセル化オブジェクトによって有効期間が制御されないポインターのことです。(スマートポインターについてはまた今度)
生ポインターには、別の非ポインター変数のアドレスや、値nullPtr
を割り当てることができます。
int* intPtr = nullptr; // declare pointer and initialize it // so that it doesn't store a random address int i = 5; intPtr = &i; // assign pointer to address of object int j = *intPtr; // dereference p to retrieve the value at its address
int*
型(int pointer 型)変数intPtr
にnullptr
を代入することができます。
ポインターは型指定されたオブジェクトまたはvoid
を指す必要があります。
型名* ポインター;
void* ポインター
ヒープ領域にオブジェクトを割り当てると、そのアドレスをポインター形式で受け取ります。このようなポインターを所有ポインターと呼びます。
class MyClass { public: void Print() { cout << "Hello" << endl; } };
MyClass型のオブジェクトをnew
で初期化することができます。この時に受け取ったmc
が所有ポインターです。
MyClass *mc = new MyClass(); mc->Print(); delete (mc);
new
で初期化したオブジェクトはヒープ領域に割り当てられるため、使い終わった時にdelete
して、メモリを解放する必要があります。メモリの解放を行わないと、メモリリークが発生します。
ポインター算術演算
ポインターはインクリメントやデクリメントをすることができ、別のアドレスを参照することができます。この操作をポインター算術演算と呼びます。
これは配列や他のデータ構造で使われます。
参考記事
感想
スタックやヒープの配列の回にしっかりメモリのアドレスまで見ていたおかげで、ポインターは入りやすいなという印象でした。また、スマートポインターが何者か気になるところです。
次回は、生ポインターの初期化から行います。