Pascal-pointer-arithmetic

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

パスカル-ポインター演算

本章で説明したように、Pascalポインターはアドレスであり、ワードに格納されている数値です。 したがって、数値で実行できるのと同じように、ポインターで算術演算を実行できます。 ポインターで使用できる算術演算子には、増分、減分、+、および-の4つがあります。

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

Inc(ptr);

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

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

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

program exPointers;
const MAX = 3;
var
   arr: array [1..MAX] of integer = (10, 100, 200);
   i: integer;
   iptr: ^integer;
   y: ^word;

begin
   ( *let us have array address in pointer* )
   iptr := @arr[1];

   for  i := 1 to MAX do
   begin
      y:= addr(iptr);
      writeln('Address of arr[', i, '] = ' , y^ );
      writeln(' Value of arr[', i, '] = ' , iptr^ );

      ( *move to the next location* )
      inc(iptr);
   end;
end.

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

Address of arr[1] = 13248
 Value of arr[1] = 10
Address of arr[2] = 13250
 Value of arr[2] = 100
Address of arr[3] = 13252
 Value of arr[3] = 200

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

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

program exPointers;
const MAX = 3;
var
   arr: array [1..MAX] of integer = (10, 100, 200);
   i: integer;
   iptr: ^integer;
   y: ^word;

begin
   ( *let us have array address in pointer* )
   iptr := @arr[MAX];

   for  i := MAX downto 1 do
   begin
      y:= addr(iptr);
      writeln('Address of arr[', i, '] = ' , y^ );
      writeln(' Value of arr[', i, '] = ' , iptr^ );

      ( *move to the next location* )
      dec(iptr);
   end;
end.

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

Address of arr[3] = 13252
 Value of arr[3] = 200
Address of arr[2] = 13250
 Value of arr[2] = 100
Address of arr[1] = 13248
 Value of arr[1] = 10

ポインターの比較

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

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

program exPointers;
const MAX = 3;
var
   arr: array [1..MAX] of integer = (10, 100, 200);
   i: integer;
   iptr: ^integer;
   y: ^word;

begin
   i:=1;

   ( *let us have array address in pointer* )
   iptr := @arr[1];

   while (iptr <= @arr[MAX]) do
   begin
      y:= addr(iptr);
      writeln('Address of arr[', i, '] = ' , y^ );
      writeln(' Value of arr[', i, '] = ' , iptr^ );

      ( *move to the next location* )
      inc(iptr);
      i := i+1;
   end;
end.

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

Address of arr[1] = 13248
 Value of arr[1] = 10
Address of arr[2] = 13250
 Value of arr[2] = 100
Address of arr[3] = 13252
 Value of arr[3] = 200