Delphiの配列名とC/C++の配列名

1527 ワード

C/C++で配列を定義すると、この配列の配列名がこの配列の開始位置のポインタであることはよく知られています.例えば、
int i[10];


配列名iはポインタであり(正確にはポインタ定数であり、この配列のヘッダアドレスのみを指すため、変更されて他のアドレスを指すことはできない)、これは&i[0](i配列の最初の要素のアドレスを取る)に等しい.
 
ではDelphiの配列と配列名は?
自分でプログラムを作ってみましょう
procedure TForm1.btn1Click(Sender: TObject);

var

  a: array[0..7] of Integer;

  i: Integer;

begin

  for i:= 0 to 7 do

    a[i]:= i;



  ShowMessage(IntToStr(Integer(a)) + '  ' + IntToStr(Integer(@a[0])));

end;


しかしコンパイル時にエラーを報告し、試行錯誤後に修正する
procedure TForm1.btn1Click(Sender: TObject);

var

  a: array[0..7] of Integer;

  i: Integer;

begin

  for i:= 0 to 7 do

    a[i]:= i;



  ShowMessage(IntToStr(Integer(@a)) + '  ' + IntToStr(Integer(@a[0])));

end;


Delphiでは,配列名を直接使用することはできない.そうでないとコンパイルエラーが発生します.配列のヘッダアドレスを取得するには、上のプログラムや@配列名[0]のような@配列名が必要ですが、配列名が配列名[0]であることを意味するわけではありません.配列名が配列の最初の要素を表すと思っている場合は、プログラムをテストして、必ずエラーを報告することができます.
一方、C/C++では、配列のヘッダアドレスを取得するには、配列名または&配列名[0]を直接使用します.
運転後の結果を図のように
だから両者の結果は同じなのでDelphiの配列名は配列のヘッダアドレスを表していますが、配列名が示すアドレスを取る方法は違います
 
Delphiで配列のアドレスを外す場合、配列名を直接使うことはできません.@を通るべきですが、このような配列名を直接使う方法もあります
procedure TForm1.btn1Click(Sender: TObject);

var

  s: string;

  a: array[0..10] of Char;

  i: Integer;

begin

  for i:=0 to 9 do

    a[i]:= 'j';

  a[10]= #0;

  s:= string(a);        //          char             

  ShowMessage(s);

end;


このようなプログラムのコンパイルに成功して、実行することができます