C++ におけるポインタからポインタへ

C Niokerupointakarapointahe



この記事では、C++ におけるポインターからポインターの概念について説明します。ポインタからポインタは、別のポインタのアドレスを指すか格納し、ポインタ自体の操作を可能にします。この概念を使用すると、メモリ内の別の場所からポインタを簡単に変更できます。ダブル ポインタは、動的に割り当てられたメモリや多次元配列で配列の要素を操作するのに役立ちます。このポインター間の動作と C++ での使用法について、適切な例を使用して説明します。

シナリオ 1: ポインタ間のメモリ表現

このシナリオでは、ダブル ポインターの宣言は、ポインター名の前にアスタリスク (*) を追加したポインター宣言と似ています。 C++ ではダブル ポインターのメモリ位置を簡単に表現できます。ポインタからポインタへのコード スニペットを以下に示します。







#include
名前空間 std を使用します。
整数メイン (
{
整数の数字 = 50 ;
整数 * ptr;
ptrr = & 桁;
整数 ** ptrr1;
ptrr1 = & ptr;
コート << 「ポインタのメモリアドレスは次のとおりです。 \n ;
コート << 'ptrr (ポインタ): ' << ptr << \n ;
コート << '*ptrr1 (ダブルポインター): ' <<* ptrr1 << \n ;
コート << ' ポインタに格納される値は次のとおりです。 \n ;
コート << '*ptrr = ' <<* ptr << 終わり;
コート << '**ptrr1 (ポインタからポインタ) = ' <<** ptrr1 << 終わり;
戻る 0 ;
}


main 関数では、メモリ アドレスをポインタに格納する必要がある変数を取得します。次に、「数字」変数を初期化します。その後、「数字」のメモリアドレスを格納する「ptrr」ポインタを宣言します。ここで、「*ptrr」ポインタのアドレスを格納する「**ptrr1」という名前のダブル ポインタを宣言します。コードの最後では、ポインタとダブル ポインタのメモリと値をコンソール画面に表示します。このコードの出力については、以下で説明します。




「ptrr」ポインタのメモリアドレスは「0x6ffe04」であり、「*ptrr1」ポインタには「ptrr」ポインタのメモリアドレスも格納される。ポインタ内に格納される値は「50」です。基本的に、ダブル ポインタのアドレスは常にポインタのメモリ アドレスと同じです。



シナリオ 2: 関数パラメータとしてのポインタからポインタへ

このシナリオでは、任意の関数でダブル ポインターをパラメーターとして渡し、任意の変数で一時的なメモリ割り当てを実行する方法を学びます。ダブル ポインターを使用した関数パラメーターのコード スニペットを以下に示します。





#include
void getMemoryAddress ( 整数 ** double_ptr {
あなたのお天気 = 200 ;
* double_ptr = & 温度;
}

整数メイン ( {
整数 * ptr_1;
整数 ** double_ptr;
double_ptr = & ptr_1;
getメモリアドレス ( double_ptr ;
std::cout << 「**double_ptr の値は次のとおりです。」 << ** double_ptr << std::endl;
戻る 0 ;
}


ここでは、ポインタ間ポインタの概念が C++ でどのように機能するかを学びます。プログラム内では 1 つのポインターがダブル ポインターで動作するように宣言されていることに注意してください。そこで、「getMemoryAddress」関数を構築します。この関数は、パラメータを渡すとダブル ポインタのメモリ アドレスを自動的に取得するように設計されています。

この関数では、「tempp」変数と「**double_ptr」ダブル ポインターを取得します。指定した変数のアドレス「tempp」をダブルポインタに渡し、ダブルポインタの値を関数の引数として渡します。プログラムは main 関数のコードの結果をコンソール画面に表示するため、main 関数内にあるものはすべて実行可能です。 main関数では「ptr_1」ポインタとdoubleポインタを「double_ptr」とします。ポインタのアドレスをダブル ポインタに渡します。



ここで、ダブル ポインタ変数をオーバーライド関数に渡し、そのポインタ変数へのポインタを「cout」出力ストリーム ステートメントに渡して、ダブル ポインタの結果を表示します。

コンパイラがオーバーライド関数に到達すると、この関数が定義されているコンパイラ チェッカーが関数内のコードを実行し、結果をメイン関数に返します。

このコードの出力を以下に添付します。


結果: ダブル ポインターの値は 200 です。

シナリオ 3: ポインタ間ポインタで 2D 配列を使用する

この例では、ダブル ポインターを持つ 2D 配列を扱います。配列を取得し、配列のアドレスをポインターに渡します。このシナリオの完全なコードは次のように提供されます。

整数メイン ( {
const int 行 = 3 ;
const int 列 = 2 ;
整数 ** 行列 = 新しい整数 * [ ;
のために ( int i = 0 ;私 < 行; ++i {
マトリックス [ = 新しい整数 [ コル ;
}
のために ( int i = 0 ;私 < 行; ++i {
のために ( int j = 0 ; j < 列。 ++j {
マトリックス [ [ j = 私 * 列 + j;
}
}
のために ( int i = 0 ;私 < 行; ++i {
のために ( int j = 0 ; j < 列。 ++j {
コート << マトリックス [ [ j << 「」 ;
}
コート << 終わり;
}
のために ( int i = 0 ;私 < 行; ++i {
消去 [ マトリックス [ ;
}
消去 [ マトリックス;
戻る 0 ;
}


ご存知のとおり、2D 配列には多数の行と複数の列があります。 main関数では、「const int」を持つ行と列を初期化します。その後、行ごとにメモリ空間を行に割り当て、列にメモリ空間を割り当てます。行数の値を行列の double ポインタのポインタとして「**matrix」として渡します。このダブルポインタでは行数のループが実行されるかtrueになります。次に、条件が false になるまで、別の内部ループが実行されます。

メモリ割り当て後、配列に値を再度割り当てます。つまり、2D 配列の行には外側のループ、列には内側のループが割り当てられます。内側のループでは、行と列の値がダブル ポインターに割り当てられ、必要な算術演算が実行されます。メモリに割り当てられた行数や列数などの 2D 配列の値を表示します。行と列の数は常に、行と列の値を格納するダブル ポインターを指します。最後に、C++ でメモリをクリアし、メモリからこの配列の割り当てを解除します。

ダブル ポインターを使用した 2D 配列の出力を以下に添付します。

シナリオ 4: Pointer to Pointer を使用してポインターを交換する

ここでは、C++ でダブル ポインターを宣言してポインターを交換する方法を学びます。このシナリオのコード スニペットを以下に添付します。

#include
ボイドスワップ ( 整数 ** ptrr_1、あなた ** ptrr_2 {
整数 * temp_var = * ptrr_1;
* ptrr_1 = * ptrr_2;
* ptrr_2 = temp_var;
}
整数メイン ( {
int x = 15 、y = 25 ;
整数 * ptrrA = & バツ、 * ptrrB = & そして;
std::cout << '交換前: *ptrrA は = ' << * ptrrA << '、*ptrrB は = ' << * ptrrB << std::endl;
スワップ ( & ptrrA、 & ptrrB ;
std::cout << 「交換後: *ptrrA is =」 << * ptrrA << ', *ptrrB is= ' << * ptrrB << std::endl;
戻る 0 ;
}


まず、両方のポインターを関数の引数として渡して、swap 関数を構築します。 swap 関数では、「temp」ポインターを取得し、しばらくの間「pointer1」の値を「temp」に渡します。次に、「pointer2」の値を「pointer1」に渡します。最後に、「temp」ポインターの値を「pointer2」に渡します。

main 関数では、「swap」関数で渡すかオーバーライドする 2 つのポインターが必要です。変数のアドレスを指定されたポインターに渡します。すると、ポインタを入れ替える前後のポインタの値が表示されます。

このコードの出力を以下に添付します。


ご覧のとおり、C++ ではダブル ポインターを使用すると、ポインターの値が正常に交換されます。

結論

ポインタからポインタには、C++ の任意のポインタのメモリ アドレスが常に格納されると結論付けました。ダブル ポインターを使用すると、いつでも任意のポインターのメモリ位置を一時的に使用できます。これは、メモリ アドレスを間接的に操作してデータにアプローチする非常に効果的な方法です。