topazの遊び場

いろいろやってみる

そろそろC++やるぞパート12 ポインター ~ 導入 ~

そろそろC++やります

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

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

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

内容

今回からポインターに入ります。難しいという噂を聞いたことがあるので、ドキュメントに入る前に簡単に説明してくれている記事を参考に概要を掴みます。

ポインター

値は変数に。 変数の値はメモリに。
メモリの位置はアドレスと呼び。
アドレスはポインター変数が持ちます。

上図のように中身(値)がアドレスになっている変数を、ポインター変数ポインターと呼びます。

配列の回などにも何回か出てきています。

宣言

間接参照演算子*)をつけることでポインターとして宣言できます。*の位置は変数の前でも型の前でもどちらでも構いません、

int *intPtr:
int* intPtr:

関節参照

関節参照演算子*)をつけると、ポインターが持つアドレスの中身にアクセスすることができます。

int main()
{
    int v = 1256;
    int *intPtr = &v;
    cout << &v << endl;
    cout << &intPtr << endl;
    cout << intPtr << endl;
    cout << *intPtr << endl;
    return 0;
}
// Output:
// 0x16b74adc8
// 0x16b74adc0
// 0x16b74adc8
// 1256

ここが少し厄介なポイントなのですが、

int *intPtr = &v;

と宣言をしていますが、

*intPtr == &v    (値 と ポインターの比較でエラー
intPtr == &v        (ポインター同士の比較で、True

比較するのはintPtr&vになります。このように考えると

int* intPtr = &v

と定義する方がわかりやすいのかなと思います。

動的割り当て

ポインターnewを使用して動的に割り当てることができます。

int *intPtr;
intPtr = new int;

宣言時に*intPtrのメモリの確保は行います。ただ、intPtrの中身のアドレスには不定の値が入っています。
new intと動的に割り当てることで、別の場所にint分のメモリを確保してそのアドレスをintPtrの値に代入します。

int main()
{
    int *intPtr;
    cout << &intPtr << endl;
    cout << intPtr << endl;
    intPtr = new int;
    cout << &intPtr << endl;
    cout << intPtr << endl;
    cout << *intPtr << endl;
    return 0;
}
// Output:
// 0x16f112dc0
// 0x100cefcbc
// 0x16f112dc0
// 0x158e068e0
// 0

割り当て前と割り当て後でintPtrの出力が変わっていることがわかります。

    cout << intPtr << endl;

他には配列のポインターや関数渡しなど、すでに触れているものばかりでした。

参考リンク

感想

ポインターが難しいという印象でしたが、ざっと見た感じそこまで難しくないかなという印象でした。

次回からは、ドキュメントを読んでしっかり見ていきたいと思います。