Cplusplus-cpp-pointer-arithmatic

提供:Dev Guides
移動先:案内検索

C ++ポインター演算

あなたが理解したように、ポインタは数値であるアドレスです;したがって、数値の場合と同様に、ポインターに対して算術演算を実行できます。 ポインターで使用できる4つの算術演算子があります:+、-、、および-

ポインター演算を理解するために、 ptr はアドレス1000を指す整数ポインターであると考えてみましょう。 32ビット整数を想定して、ポインタで次の算術演算を実行しましょう-

ptr++
*ptr* は、ptrがインクリメントされるたびに次の整数を指すため、位置1004を指します。 この操作は、メモリ位置の実際の値に影響を与えることなく、ポインタを次のメモリ位置に移動します。 ptrがアドレスが1000の文字を指す場合、次の文字は1001で使用できるため、上記の操作は位置1001を指します。

ポインターをインクリメントする

定数ポインターであるため増分できない配列名とは異なり、変数ポインターは増分できるため、プログラムでは配列の代わりにポインターを使用することをお勧めします。 次のプログラムは、配列の後続の各要素にアクセスするために変数ポインタをインクリメントします-

#include <iostream>

using namespace std;
const int MAX = 3;

int main () {
   int  var[MAX] = {10, 100, 200};
   int  *ptr;

  //let us have array address in pointer.
   ptr = var;

   for (int i = 0; i < MAX; i++) {
      cout << "Address of var[" << i << "] = ";
      cout << ptr << endl;

      cout << "Value of var[" << i << "] = ";
      cout << *ptr << endl;

     //point to the next location
      ptr++;
   }

   return 0;
}

上記のコードをコンパイルして実行すると、次のような結果が生成されます-

Address of var[0] = 0xbfa088b0
Value of var[0] = 10
Address of var[1] = 0xbfa088b4
Value of var[1] = 100
Address of var[2] = 0xbfa088b8
Value of var[2] = 200

ポインターのデクリメント

同じ考慮事項は、以下に示すように、そのデータ型のバイト数だけ値を減らすポインタのデクリメントにも適用されます-

#include <iostream>

using namespace std;
const int MAX = 3;

int main () {
   int  var[MAX] = {10, 100, 200};
   int  *ptr;

  //let us have address of the last element in pointer.
   ptr = &var[MAX-1];

   for (int i = MAX; i > 0; i--) {
      cout << "Address of var[" << i << "] = ";
      cout << ptr << endl;

      cout << "Value of var[" << i << "] = ";
      cout << *ptr << endl;

     //point to the previous location
      ptr--;
   }

   return 0;
}

上記のコードをコンパイルして実行すると、次のような結果が生成されます-

Address of var[3] = 0xbfdb70f8
Value of var[3] = 200
Address of var[2] = 0xbfdb70f4
Value of var[2] = 100
Address of var[1] = 0xbfdb70f0
Value of var[1] = 10

ポインターの比較

ポインターは、==、<、>などの関係演算子を使用して比較できます。 p1とp2が、同じ配列の要素など、相互に関連する変数を指している場合、p1とp2を有意義に比較できます。

次のプログラムは、それが指すアドレスが配列の最後の要素のアドレス、つまり&var [MAX-1]以下である限り、変数ポインタをインクリメントすることにより、前の例を変更します-

#include <iostream>

using namespace std;
const int MAX = 3;

int main () {
   int  var[MAX] = {10, 100, 200};
   int  *ptr;

  //let us have address of the first element in pointer.
   ptr = var;
   int i = 0;

   while ( ptr <= &var[MAX - 1] ) {
      cout << "Address of var[" << i << "] = ";
      cout << ptr << endl;

      cout << "Value of var[" << i << "] = ";
      cout << *ptr << endl;

     //point to the previous location
      ptr++;
      i++;
   }

   return 0;
}

上記のコードをコンパイルして実行すると、次のような結果が生成されます-

Address of var[0] = 0xbfce42d0
Value of var[0] = 10
Address of var[1] = 0xbfce42d4
Value of var[1] = 100
Address of var[2] = 0xbfce42d8
Value of var[2] = 200