コンテンツにスキップ

ポインタと参照

ポインタ

ポインタというのは他の変数を参照する仕組みの1つです。 Windows のショートカットや Linux のシンボリックリンクと同じような機能です。

int x = 5;
int* p = &x;

int* と書くと int 型の変数を指すポインタ型となります。 &x というのは x を指すポインタを得るための演算です。

nullptr

どの変数も参照していないポインタのことをヌルポインタと呼びます。C++ではヌルポインタを表すキーワードとして nullptr が用意されています。

int* p = nullptr;

NULL マクロ

C++11 より前はヌルポインタを表すのに nullptr というキーワードではなくC言語から受け継いだ NULL を使用するのが一般的でした。 C言語の処理系では、 void* 型の変数は任意のポインタ型に暗黙変換される仕様があるため、 NULL(void*)0 などと定義している例が見られました。 C++ではそのような暗黙変換は許されていないため、 NULL は単に 0 と定義される例が見られました。 しかし 0 というリテラルは文脈によってヌルポインタと解釈されたり int 型と解釈されたりするため不都合が生じることもありました。

C++11 ではこの問題を解決するために nullptr が導入されました。 そのため C++11 以降では NULL ではなく nullptr を使うようにしましょう。

詳細は nullptr - cpprefjp C++日本語リファレンス を参照してください。

デリファレンス(逆参照)

ポインタが指す変数の値を参照するには次のように書きます。

int x = 5;
int* p = &x;
int y = *p;

変数からポインタを得るときには & を付け、ポインタから値を得るには * を付けます。

constポインタ

ポインタ型に const を付ける場合、 const の付ける位置によって意味合いが変わります。

* の前に const を付けると、ポインタが指し示す値を書き換えることができなくなります。

int x = 123;
const int* p = &x;
*p = 456; // エラー

* の後に const を付けると、ポインタ自身を書き換えることができなくなります。

int x = 123;
int* const p = &x;
p = nullptr; // エラー

併用することも可能です。

const int* const p = &x;

参照

ポインタに似た仕組みとして参照があります。

int x = 100;
int* p = &x; // pはポインタ型
int& r = x; // rは参照型

*p = 200;
r = 200;

int& と書くと int の参照型となります。

ポインタが指し示す値を扱うには * を付けてデリファレンスする必要がありますが、 参照では何も付与する必要がないため、見た目上では値型のように使うことが出来ます。