C++ での逆参照ポインター
このチュートリアルは、C++ でのポインターの逆参照に関する簡単な説明です。
実際のトピックに移る前に、まずポインターとは何か、C++ プログラマーがその必要性に遭遇する理由を理解する必要があります。
C++ のポインター
C++ では、変数はその識別子によってアクセスされるメモリ位置と見なされます。 この方法では、プログラマは特定の変数が格納されているメモリの物理アドレスを認識せず、その識別子または変数名でアクセスします。
C++ プログラムでは、物理メモリは、各セルが 1 バイト サイズの一連のメモリ セルです。 1 バイトを超える変数をメモリに保存すると、連続したメモリ位置が使用されます。
たとえば、int
変数のサイズは 4 バイトなので、整数値を格納するには 4つの連続したメモリ セルが必要です。
変数が C++ で宣言されると、必要な量のメモリが特定のアドレス (物理アドレスと呼ばれる) に割り当てられます。 これは通常、実行時に、オペレーティング システムまたはその物理アドレスがあるプログラムの環境によって決定されます。
このメモリアドレスにアクセスして、変数に格納できます。 address-of
演算子と呼ばれる演算子を使用してアクセスし、記号 &
で表します。
&
演算子を使用して C++ でメモリ アドレスを取得する
address-of
演算子は、特定の変数が格納されているメモリ アドレスを取得します。 変数名の前に &
演算子を付けて使用します。
以下のコード スニペットを参照してください。
addr = &newvar
これにより、変数 newvar
のアドレスが変数 addr
に割り当てられますが、コンテンツには割り当てられません。 これを下の図に示します。
例:
newvar = 25;
addr = &newvar
出力:
このコードでは、まず変数 newvar
に値 25
を代入し、newvar
をメモリ位置 3
に格納します。 次に、newvar
のアドレスを変数 addr
に割り当てました。
したがって、newvar
のアドレスを格納した addr
変数は、newvar
のメモリ アドレスである値 3
を持ちます。
C++ でポインターを宣言する
別の変数のアドレスを格納するために使用される変数は、ポインター変数と呼ばれます。 上記の例では、addr
変数はポインターです。
ポインターは、プログラミングにおいて非常に強力な機能です。 特定の型のポインター変数は、同じ型の変数を指します。
ポインタ変数の宣言時にアスタリスク(*
)演算子を使用して宣言します。 以下のコード スニペットを検討してください。
#include <iostream>
using namespace std;
int main() {
int num = 5;
int* pNum;
pNum = #
cout << "Value of num is: " << num << endl;
cout << "Address of num is: " << pNum << endl;
return 0;
}
出力:
プログラム出力は、5
である newvar
の値と、pNum
ポインターに格納されているそのアドレスを示しています。
ポインターは変数値を直接指すことができるため、ポインターが指す変数と同じデータ型を持っている必要があります。
構文:
datatype * nameOfPointer;
ここで、data type
はそれが指す変数の型です。
例:
int* numPtr;
char* charPtr;
double* doublePtr;
このコード スニペットには 3つのポインターの宣言がありますが、それらは異なる型です。 これらは、メモリ内で同じ量のスペースを占有することを意図しています (スペースの量は、プログラムの環境によって異なります)。
どちらも異なるタイプの変数を指すことはできません。
*
演算子を使用して C++ でポインターを逆参照する
前の例では、address-of
演算子を使用して変数のアドレスをポインターに格納しました。 逆参照演算子 (*
) は、ポインターが指している変数の内容を取得します。
アドレスがポインターに保存されている変数値を取得できます。
以下の例では、ポインターを逆参照し、変数を直接使用して、変数 newvar
値にアクセスします。 出力で、両方が同じであることがわかります。
#include <iostream>
using namespace std;
int main() {
int num = 5;
int* pNum;
pNum = #
cout << "Value of num is: " << num << endl;
cout << "Address of num is: " << pNum << endl;
cout << "Value of num by using pointer: " << *pNum << endl;
return 0;
}
出力:
次のように、逆参照された値を他の変数に保存することもできます。
num2 = *pNum;
これは、num2
が pNum
が指す変数値と等しいことを意味します。 これを次の図に示します。
ここで、参照解除演算子を使用して num
と同じ値が num2
に割り当てられます。
逆参照はコピーを作成するか
逆参照以上のことを行うと、逆参照によってコピーが作成されることがあります。 したがって、上記の例に示すように、その参照解除された値を使用して新しい変数を初期化すると、それはコピーになります。
しかし、逆参照された値を使用して参照変数に参照として保存すると、それはコピーではなくエイリアスが作成されます。
int num = 5;
int* pNum = #
int& num2 = *pNum;
逆参照演算子は、最後の行で参照変数 num2
を初期化しました。 この参照変数 num2
は num
のアドレスを含み、num
のエイリアスです。 その値はコピーされません。
これについては、下の図で説明します。
num
のメモリ アドレスが含まれているため、num2
も num
を指します。 したがって、ポインターはプログラミングに役立つツールであり、プログラミング中の効率的なメモリと時間の管理を提供します。
Husnain is a professional Software Engineer and a researcher who loves to learn, build, write, and teach. Having worked various jobs in the IT industry, he especially enjoys finding ways to express complex ideas in simple ways through his content. In his free time, Husnain unwinds by thinking about tech fiction to solve problems around him.
LinkedIn