ポインタの初歩

ポインタはメモリアドレスを指す変数です。最初のうちは、あまり意識しなくてもいいと思います。さっそく、例を見て見ましょう。

procedure TForm1.Button1Click(Sender: TObject);
var
  x, y: Integer;
  p: ^Integer;  // Integer値を指すポインタとしてPを宣言
begin
  x := 10;
  p := @x;   // @x で x のアドレスを p に代入
  y := p^;   // p が指すアドレスに格納されている値
  
  ShowMessage(IntToStr(y));
end;

^(キャレット)には2通りの使い方があります。

^型名
これは、指定された変数を指すポインタです。上の例で示した通り、予め型を指定してやることが出来ます。
ポインタ^
ポインタを逆参照します。つまり、ポインタが指すアドレスに格納されている値を返します。

上の例で言いますと、まず x := 10で x に値( 10 )を入れると同時にその x の居場所( アドレス )も決まります。そのアドレスを表示するのに必要なのが @ 演算子です。p := @x で、x( 値は 10 )の居場所(アドレス)をPに教えてあげている(代入)のです。
この時点で、p は x の居場所がわかり、そして x は何者なのか( 値はいくらなのか )がわかるのです。 Xの値をPで表現するにはP^、つまり逆参照と呼ばれている方法を使って表します。ポインタ^( ここでは p^ )とすることによって、そのポインタの指している値をたぐり寄せているといった感じでしょうか。

次の例も参考にして下さい。

procedure TForm1.Button1Click(Sender: TObject);
var
  p: PChar;
  s: string;
begin
  s := 'HelloWorld';
  p := PChar(s); // s を PChar に型キャスト。
                 // p は s の先頭の文字(つまり h )を指している。
  
  Inc(p, 5); // p を5文字分進める。つまり p が指しているのは、W になる。
 
  ShowMessage(p^); // 逆参照を使って、pが指している文字を表示。
end;

p := PChar(s); の部分が分かりにくいかもしれません。文字列を PChar にキャストした時点で、その 文字列の先頭をポインタが指している。ということだけ分かればいいのではないでしょうか。また、上記の ^Integer というのは、PInteger としても同じになります。PInteger はポインタ型といって、ほとんどの型( PDouble、PString、P・・・)に用意されています。なぜこのようなポインタ型があるのかというと、これは汎用の Pointer 型を型キャストするために存在するようです。 例を見て見ましょう。

procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
  p: Pointer; // ポインタ型 p を宣言
  pInt: PInteger;
begin    
  i := 12;
  p := @i; // ポインタ型 p に i のアドレスを代入
    
  pInt := PInteger(p); // Pointer 型を PInteger 型にキャスト
  
  ShowMessage(IntToStr(pInt^));
end;

Pointer型を使う利点は、まずPoiner型で変数を参照しておくことで、後で型キャストしてやれば 任意の型のデータとして扱うことができることです。


up next
Last update 2002/2/24