topazの遊び場

いろいろやってみる

そろそろC++やるぞパート13 ポインター ~ ポインターとは ~

そろそろC++やります

そろそろC++をやります。そろそろC++をやりたいからです。
何回やるかはわかりません。基礎を理解するまではやろうと思います。

という感じでやっています。

※ 初心者がメモレベルで記録するので、技術記事としてはお力になれないかもしれません。

内容

ポインター

ポインターはメモリのアドレスを格納する変数です。

int a = 123;
int *intPtr = &a:

この場合intPtrの変数がポインターです。

以下がCとC++の主要な3つの使用目的です。

  1. ヒープ上に新しいオブジェクトを割り当てる。
  2. 関数を他の関数に渡す。
  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 型)変数intPtrnullptrを代入することができます。

ポインターは型指定されたオブジェクトまたはvoidを指す必要があります。

型名*   ポインター;
void*    ポインター

ヒープ領域にオブジェクトを割り当てると、そのアドレスをポインター形式で受け取ります。このようなポインター所有ポインターと呼びます。

class MyClass
{
public:
    void Print()
    {
        cout << "Hello" << endl;
    }
};

MyClass型のオブジェクトをnewで初期化することができます。この時に受け取ったmcが所有ポインターです。

MyClass *mc = new MyClass();
mc->Print();
delete (mc);

newで初期化したオブジェクトはヒープ領域に割り当てられるため、使い終わった時にdeleteして、メモリを解放する必要があります。メモリの解放を行わないと、メモリリークが発生します。

ポインター算術演算

ポインターはインクリメントやデクリメントをすることができ、別のアドレスを参照することができます。この操作をポインター算術演算と呼びます。
これは配列や他のデータ構造で使われます。

参考記事

感想

スタックやヒープの配列の回にしっかりメモリのアドレスまで見ていたおかげで、ポインターは入りやすいなという印象でした。また、スマートポインターが何者か気になるところです。

次回は、生ポインターの初期化から行います。