最初のケースでは、変数The_lord_of_the_rings
はオブジェクトです。2 番目のケースでは、変数は、オブジェクトがあるメモリ内の別の場所を指しています。
簡単な ASCII 画像を試してみましょう。
最初のケースでは、オブジェクトがあります:
+-----------------------------------------------------+
| | ロード・オブ・ザ・リング |
| | (オブジェクトに関連付けられたすべてのデータ) |
+-----------------------------------------------------+
2 番目の例では、ポインターがあります。
+------------------------------------+ +------------------------ ------+
| | ロード・オブ・ザ・リング | ----> | 実際のオブジェクトとそのデータ |
+------------------------------------+ +------------------------ ------+
ただし:コメントで juanchopanza が指摘したように、ポインターは実際には有効なオブジェクトを指している必要はありません。ポインターをローカル変数として宣言しただけでは、ポインターは初期化されず、メモリ内の一見ランダムな場所を指します。この場合、逆参照 (ポインターが指すデータへのアクセス) は未定義の動作につながり、実際にプログラムをクラッシュさせる可能性があります。ポインタは、使用する前に有効なオブジェクトを指すように常に初期化する必要があります。
最新の C++ では、ポインター、特に生のポインターを使用する理由はほとんどありません。std::unique_ptr
やなどの優れた「スマート ポインター」が用意されstd::shared_ptr
ました。
ポインターをいつ使用するかは状況によって大きく異なりますが、一般的には、プレーンなオブジェクトと参照を使用すると長い道のりを歩むことができます。