C++ ポインタ演算

C Pointa Yan Suan



この記事は C++ でのポインター演算について説明します。ポインタは、データのメモリアドレスを格納する変数です。ポインタ演算は、C++ プログラミング言語の世界における強力な特徴であり、これにより、加算、乗算、除算、増分、減分、および減算にポインタを使用してメモリ バッファ内の新しいメモリ アドレスを開発するさまざまな算術演算を処理できるようになります。 。ポインタ演算により、動的なメモリ割り当てが簡単に作成されます。この C++ の記事では、ポインターを使用してさまざまな方法でメモリ アドレスを操作する方法を学び、適切なガイドラインと例を提供します。

シナリオ 1: ポインターがインクリメント操作とデクリメント操作を実行する

ここでは、異なる目的を持つ異なるメモリ アドレスを生成するポインタ操作について学びます。インクリメント ポインターとデクリメント ポインターは、ポインターが指すデータ型のサイズを 1 倍した係数でアドレスを増減するレバレッジ ポインター演算でもあります。このシナリオに関連するコード スニペットを以下に添付します。







#include
名前空間 std を使用します。
const int Arr_Max = 5 ;
整数メイン ( {
int どこで [ Arr_Max = { 二十 150 270 } ;
整数 * ptr; // 宣言する ポインタ
ptr = var;
のために ( int i = 0 ;私 < Arr_Max; i++ {
std::cout << '要素のメモリ アドレスは : [' << << '] = ' ;
std::cout << ptr << 終わり;
コート << 「アドレスに対する値は [」 << << '] = ' ;
コート << * ptr << 終わり;
std::cout << 「ポインタは正常にインクリメントされました」 << 終わり;
ptr++;
}
std::cout << 「デクリメント前のポインタアドレス」 << ptr << 終わり;
ptr--;
std::cout << 「デクリメント後のポインタアドレス」 << ptr << 終わり;
戻る 0 ;
}


ここでは、コードの最初の部分で必要なライブラリ「 」を定義します。メモリ内のスペースを確保するためのメモリ割り当てを定義します (「Arr_Max=5」)。 main 関数では、配列を初期化し、その配列にメモリ サイズを渡します。次に、メモリ上のメモリアドレスを指すために「ptr」ポインタ宣言も必要です。



配列をポインタに渡してアドレスにアクセスします。ご存知のとおり、配列には常に、異なる場所に複数の項目が含まれています。そのため、配列のすべての要素にアクセスするには、「ヘルプ」ポインターを含むループが必要でした。ループが実行されるたびに、メモリ アドレスをメモリの次のアドレスにシフトするポインタ算術「ptr++」インクリメント演算子を使用して、メモリ アドレスとこのアドレスに対する値を取得します。ループの実行サイクルは配列のサイズによって異なります。ループの外側では、「ptr--」デクリメント ポインタを使用するだけで、ポインタを前のメモリ アドレスに戻したいと考えています。



「実行」>「コンパイルして実行」オプションをクリックしてこのコードを実行すると、次の出力が得られます。






この出力が理解しやすいことを願っています。メモリのアドレスと値が変更されます。ポインターを 1 つの位置から移動することは、C++ のインクリメント ポインター演算によってのみ可能です。

シナリオ 2: C++ で 2 つのポインターを減算する

このシナリオでは、C++ で 2 つ以上のポインターを減算する方法を学習します。 2 つのポインターを同時に減算できるのは、それらのデータ型が同じである場合のみであるため、減算に伴うすべての算術演算は重要なプロセスです。



加算、乗算、除算などの他の演算は、メモリのアドレス指定では意味がないため、ポインタでは実行できません。コード スニペットは以下に添付されています。

#include
整数メイン ( {
彼は手招きする [ = { 23 36 42 51 62 77 89 96 100 } ;
整数 * ptrr1 = & それに対して [ 3 ; // 3番目の要素へのポインタ ( 42
整数 * ptrr2 = & それに対して [ 6 ; // 6番目の要素へのポインタ ( 89
ptrdiff_t ptrsubtract = ptrr2 - ptrr1;

std::cout << 「これらのアドレスの違いは次のとおりです。」 << ptrsubtract << 「要素」 << std::endl;
戻る 0 ;
}


減算演算は、C++ のメモリ アドレスの差を求めることです。 main 関数では、異なるインデックスに異なる値を含む配列を取得します。配列では、すべてのインデックスに異なるメモリ位置があります。 2 つのポインター間の違いを見つけるには、ポインター演算を使用する必要があります。ここでは、C++ で 2 つ以上のポインター間の違いを見つけるために使用する必要がある特別なポインター型「ptrdiff_t」を使用します。

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


これらのアドレスの違いは、要素 vise (3) によるものです。

シナリオ 3: C++ で 2 つ以上のポインターを比較する

このシナリオでは、「==」、「<=」、「>=」、「<」、「>」などのさまざまな関係演算子を使用して、C++ でさまざまなポインターを比較する方法を学びます。ポインタが同じ配列の要素のアドレスを指している場合にのみ、ポインタを比較できます。型の異なる 2 つのポインターを比較すると、未定義の動作が発生する可能性があることに注意してください。ポインター比較に関連するコード スニペットを以下に示します。

#include
名前空間 std を使用します。
整数メイン (
{
int arr1 [ 10 = { 4 7 9 十一 14 16 18 二十 22 25 } ;
整数 * ptr1 = & arr1 [ 3 ;
整数 * ptr2 = & arr1 [ 6 ;
整数 * ptr3 = & arr1 [ 8 ;
整数 * ptr4 = & arr1 [ 9 ;
もし ( ptr1 ==ptr2
{
std::cout << 「ポインタが等しい」 << 終わり;
}
それ以外 もし ( ptr3 < =ptr4
{
std::cout << 「ptr3 は ptr4 以下です」 << 終わり ;;
}
それ以外
{
std::cout << 「ポインタはどの段階でも比較されません」 << 終わり;
}
戻る 0 ;
}


ここでは、10 個の要素を持つ配列を取り上げます。配列の異なるインデックスを指す 4 つのポインターを宣言します。その後、指定されたコードに見られるように、これら 4 つのポインターをさまざまな条件で比較します。 「if」条件で、「ptr1」ポインタが「ptr2」ポインタと等しいかどうかを確認し、「ポインタが等しい」ことを出力します。複数の条件がある場合、「else if」条件を使用して、「ptr3」ポインターが「ptr4」ポインター以下であるかどうかを確認します。すべて完了したら、 実行 > コンパイルと実行 オプション。

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


有効な条件がコンソール画面に表示され、コンパイルが終了します。 「ptr3」ポインタには、「ptr4」ポインタの指す値以下の値が含まれています。

シナリオ 4: ポインター演算を使用して奇数を表示する

ここでは、整数の配列にメモリを動的に割り当てる方法を見ていきます。このケースに関連するコード スニペットを以下に示します。

#include
整数メイン ( {
整数 [ = { 1 12 33 24 15 776 71 18 29 50 } ;
整数 * ptrr = 数値;
std::cout << 「配列内の奇数:」 ;
のために ( int i = 0 ;私 < 10 ; ++i {
もし ( * ptr % 2 = 0 {
std::cout << * ptr << 「」 ;
}
ptrr++;
}
std::cout << std::endl;
戻る 0 ;
}


main 関数では、10 個の要素を含む配列を取得します。配列内の奇数をチェックするには、配列内のすべての要素を指すポインターが必要です。 「for」ループでは、配列の現在の要素を除算して奇数をチェックします。ポインタ カウンタは、配列の 1 つの要素をチェックした後にインクリメントされます。

コードを実行すると、次のような出力がコンソール画面に表示されます。


このようにして、コンソール画面にポインター演算を使用して奇数を表示できます。

結論

ここで、ポインター演算が C++ でさまざまな演算を実行する最も効果的なツールであると結論付けます。ポインターが同じデータ型を持つ配列の値を増加または減少させることを確認してください。 C++ プログラミング言語のポインター演算を利用して、配列の値をメモリ アドレスで比較できます。ポインター演算を使用すると、配列をトラバースしてメモリを簡単に管理できます。