なんでポインタ演算ができないのよ(しくしく)

今回はC言語がわからない人は・・・がんばってね(ぉぃ)

では、まず下のソースを見てください。

  char *p;
  char s[1000];
  
  strcpy(s, "Hello World");
  
  p = &s[0];  // p = s; の方が良い?
  
  p[6] = 'w';
  *(p + 6) = 'W';

言うまでもなくC言語ではこのようにポインタ変数に配列の添え字を付けてアクセスしたり、ポインタの足し算も自由です。
(注)わざわざコンパイラにかけたりしてないのでバグがある可能性を否定しません(よわ)

では、このソースを Pascal にそのまま変換してみましょう。

var
  P : ^Char;
  S : array[0..999] of Char;
begin
  StrCopy(S, 'Hello World');

  p := @S[0];  // p := s; は不可

  P[6] := 'w';         //88行
  (P + 6)^ := 'W';     //89行
end;

コンパイルすると見事に以下のようにエラーが出ます。

[エラー] Unit1.pas(88): 配列型が必要です
[エラー] Unit1.pas(89): この型には指定した演算子は使えません
[致命的エラー] Project1.dpr(5): 'Unit1.pas' ユニットはコンパイルできませんでした。

Pascal ではC言語に比べてポインタの利用にかなり制限があります。
直接足し算、引き算なんてもってのほか。
配列の添え字を付けても許してもらえません。
有効なものは Inc, Dec, Pred, Succ, Ord, Odd 等の順序関数だけのはずです。

今回のお題はポインタに配列的なアクセスをしてしまおうというものです。
基本的にポインタの足し算は配列の添え字の演算に置き換えれるのでこれで問題は解決・・・のはず。
なにも考えずにソース

type
  TCharArray = array[0 .. High(Integer) - 1] of Char;
  PCharArray = ^TCharArray;

var
  P : PCharArray;
  S : array[0..999] of Char;
begin
  StrCopy(S, 'Hello World');

  P := @S[0];

  P[6] := 'w';
end;

TCharArray の配列の大きさはアクセスするときに最低限必要な数があれば良いです。
今回は配列の大きさの限界の数(変数の領域がちょうど2GBになる数)にしてあるので TCharArray 型の変数を実際に作らないように。
メモリ不足でフリーズしても責任取れません(笑)

結論的に言うとX型のポインタ変数の代わりにX型の配列型のポインタ変数を使うということです。
なんか今回はまとまりが悪いな(ぼそっ)

補足:
PCharArray など使わなくても PChar で良いです。
例なのでわざわざ PCharArray をこしらえただけです。


Return index page