EngineIT技術を分かりやすく簡潔にまとめることによる学習の効率化、また日常の気付きを記録に残すことを目指します。基本的には両方とも、ある変数が別の変数にアクセスするために使用します。●ポインタ「ポインタ」は、ある変数の「メモリアドレス」を格納するための変数です。存在している、ある変数の「別名」を格納するための変数です。内部的には対象となる変数のアドレスを保持する点はポインタと似ていますが、一度値を代入したら変更できない点から、ポインタの定数版のような動きになっています。(図111)(※注1)デリファレンスとは?まずリファレンスが変数が格納されているメモリのアドレス値の事です(≒ポインタ)。一方で、リファレンスが指すメモリに格納された値そのものを取得する事をデリファレンスと呼びます。両者の違い1:宣言/初期化それぞれの初期化のお作法は以下の通りです。●ポインタポインタ「*ptr1」にint型変数「i1」のアドレス「&i1」を代入します。参照「&rfr1」にint型変数「i1」を代入します。両者の違い2:再代入ポインタは再代入して使えるのに対して、参照は再代入できません(コンパイルエラーになる)。●ポインタポインタは値の再代入が可能です。これは、LinkedList(値と次要素のアドレスを連結した配列)等の実装などで役に立ちます。次はメモリ領域に関する、ポインタと参照の違いです。●ポインタ元の変数とは別にメモリ領域を使用します。以下のコードで「&ptr」がポインタ自身のアドレス、「&a1」はポインタが指し示す変数のアドレスで、両者は異なる値になっています。元の変数と同じアドレスを使用します(一部スタック領域も使用します)。そのため、参照のアドレスである「&rfr」と、参照先の変数のアドレス「&a1」は同じ値になっています。間接参照とは、例えば「ポインタのポインタ」といった具合に、参照を複数回連鎖的につなげる事を言います。ポインタではこれが出来ますが、参照では出来ません。ポインタは「**ptr2」のように「*」を2つ繋げて「ポインタのポインタ」を定義できますが、参照は「&&rfr2」のように「&」を2つ繋げる事は出来ません(NG)。「ポインタ」の補足(※注1)ポインタ演算とは?C++ではポインタに対して、int型の「足し算」や「引き算」をする事が可能です。ポインタ「ptr1」がint型のアドレスを保持している場合、「ptr1+1」は「ptr1」の後の次のint型のアドレスを指し示します。0xceb099c8この例では「ptr1++」する毎に「ptr1」が指すアドレスが「0xceb099c0」→「0xceb099c4」→「0xceb099c8」のように変化していきます(int型は4バイトのため、0→4→8)。「ポインタ」と「参照」の主な使いどころ●ポインタの使いどころ・ポインタ演算をしたり、NULL値を代入する必要があるケースで使用します(例:配列など。配列へのアクセスはポインタ演算で実装されている)・LinkedListといったデータ構造を実装する際に使用します。コメントをキャンセルメールアドレスが公開されることはありません。※サイト次回のコメントで使用するためブラウザーに自分の名前、メールアドレス、サイトを保存する。EngineIT技術を分かりやすく簡潔にまとめることによる学習の効率化、また日常の気付きを記録に残すことを目指します。Reserved.Top。