1-16-2. ポインタ演算

公開日: 22:54 1. 基本編/1-16. ポインタ/1-16-2. ポインタ演算

アドレスが数値であると理解しました。したがって、数値と同様にポインタに算術演算を実行することができます。ポインタに使える算術演算は++、--、+、-の4つがあります。

ポインタの算術を理解するため、アドレス1000を指すint型ポインタptrの例を考えてみましょう。32ビット整数と仮定し、次の算術演算をポインタに実行します。
ptr++;
ptrを増やす度に次の整数を指すため、ptrは位置1004を指します。この演算はメモリ位置の実際の値に影響せずにポインタを次のメモリ位置へ動かします。ptrがアドレスが位置1000のchar型を指している場合、上の演算は次のchar型が1001で利用可能になるため、1001を指します。

ポインタの加算

配列の代わりにポインタの使用を推奨するのは、定数ポインタのため加算することのできない配列名と違い、変数ポインタは加算することができるからです。以下のプログラムは変数ポインタを加算して配列の要素に順次アクセスしています。
#include <iostream>

using namespace std;
const int MAX = 3;

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

   // ポインタに配列のアドレスをコピー
   ptr = var;
   for (int i = 0; i < MAX; i++)
   {
      cout << "var[" << i << "]のアドレス = ";
      cout << ptr << endl;

      cout << "var[" << i << "]の値 = ";
      cout << *ptr << endl;

      // 次の場所を指す
      ptr++;
   }
   return 0;
}
上のコードをコンパイルし実行すると、次のような結果が得られます。
var[0]のアドレス = 0xbfa088b0
var[0]の値 = 10 
var[1]のアドレス = 0xbfa088b4
var[1]の値 = 100
var[2]のアドレス = 0xbfa088b8
var[2]の値 = 200

ポインタの減算

ポインタの減算に同じ考えを適用し、次のようにデータ型のバイト数だけ減らしてみましょう。
#include <iostream>

using namespace std;
const int MAX = 3;

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

   // 最後の要素のアドレスをポインタにコピー
   ptr = &var[MAX-1];
   for (int i = MAX; i > 0; i--)
   {
      cout << "var[" << i << "]のアドレス = ";
      cout << ptr << endl;

      cout << "var[" << i << "]の値 = ";
      cout << *ptr << endl;

      // ひとつ前の場所を指す
      ptr--;
   }
   return 0;
}

上のコードをコンパイルし実行すると、次の結果が得られます。
var[3]のアドレス = 0xbfdb70f8
var[3]の値 = 200
var[2]のアドレス = 0xbfdb70f4
var[2]の値 = 100
var[1]のアドレス = 0xbfdb70f0
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;

   // 配列の最初の要素のアドレスをコピー
   ptr = var;
   int i = 0;
   while ( ptr <= &var[MAX - 1] )
   {
      cout << "var[" << i << "]のアドレス = ";
      cout << ptr << endl;

      cout << "var[" << i << "]の値 = ";
      cout << *ptr << endl;

      // ひとつ前の場所を指す
      ptr++;
      i++;
   }
   return 0;
}

上のコードをコンパイルし実行すると、次のような結果が得られます。
var[0]のアドレス = 0xbfce42d0
var[0]の値 = 10
var[1]のアドレス = 0xbfce42d4
var[1]の値 = 100
var[2]のアドレス = 0xbfce42d8
var[2]の値 = 200
  • ?±??G???g???[?d????u?b?N?}?[?N???A

0 件のコメント :

コメントを投稿