ポインタはメモリアドレスを指す変数です。最初のうちは、あまり意識しなくてもいいと思います。さっそく、例を見て見ましょう。
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型で変数を参照しておくことで、後で型キャストしてやれば 任意の型のデータとして扱うことができることです。