HOWTO · C++

C++ での逆参照ポインター

このチュートリアルでは、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 = &num;
  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 = &num;
  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;

これは、num2pNum が指す変数値と等しいことを意味します。 これを次の図に示します。

図デモ

ここで、参照解除演算子を使用して num と同じ値が num2 に割り当てられます。

逆参照はコピーを作成するか

逆参照以上のことを行うと、逆参照によってコピーが作成されることがあります。 したがって、上記の例に示すように、その参照解除された値を使用して新しい変数を初期化すると、それはコピーになります。

しかし、逆参照された値を使用して参照変数に参照として保存すると、それはコピーではなくエイリアスが作成されます。

int num = 5;
int* pNum = &num;
int& num2 = *pNum;

逆参照演算子は、最後の行で参照変数 num2 を初期化しました。 この参照変数 num2num のアドレスを含み、num のエイリアスです。 その値はコピーされません。

これについては、下の図で説明します。

図の説明

num のメモリ アドレスが含まれているため、num2num を指します。 したがって、ポインターはプログラミングに役立つツールであり、プログラミング中の効率的なメモリと時間の管理を提供します。