静态数组和动态数组不同,静态数组是在栈内存中自动分配,一旦静态数组声明了,编译器就自动在栈进行分配了。如你声明的a,就分配了16个字节的内存空间。而动态数组不同,动态数组实际上就是指针。只不过是个特殊点的指针,和string类型差不多。声明了一个动态数组,只是声明了一个四字节的指针。必须通过setlength给动态数组分配内存空间。所以
type TArray = array of char;这个TArray就是一个指针类型。
type PArray = ^TArray;这个Parray就是一个指向指针的指针类型。
在静态数组中@a就是自动分配空间的首地址,也就是@a[0]的地址,如果a: array[1..15] of char;那就是@a[1]的地址。可以说@a就是这个静态数组的地址。
如果声明了一个动态数组b:Tarray,那么b只是一个指针,@b是指向这个指针的地址。如果b分配了空间的话,@b[0],才是分配空间的首地址。
b:=@a就是将动态数组b指向了静态数组。注意只是指向不是分配。
procedure TForm1.FormCreate(Sender: TObject);
var
i: integer;
Tmy_array:Tarray;
begin
Tmy_array := @a;
for i := 0 to 14 do
begin
a[i] := 'b';
end;
a[15] := Char(63);
Tmy_array[0] := 'a';
showmessage(a[0]);
end;
这样写容易理解吧!其实Tarray就是指针类型,Tmy_array就是指针。
procedure TForm1.FormCreate(Sender: TObject);
var
i: integer;
Tmy_array:pointer;
begin
Tmy_array := @a;
for i := 0 to 14 do
begin
a[i] := 'b';
end;
a[15] := Char(63);
TArray(Tmy_array)[0] := 'a';
showmessage(a[0]);
end;
这样写也不难理解吧。将Tmy_array无类型指针转换成Tarray类型指针。
procedure TForm1.FormCreate(Sender: TObject);
var
i: integer;
Tmy_array:pointer; //这个Pointer可以改成Tarray,Parray都可以,只要是指针类型就行
Pmy_array:PArray;
begin
Tmy_array := @a;
Pmy_array:=@Tmy_array; //Pmy_array为指向指针的指针
for i := 0 to 14 do
begin
a[i] := 'b';
end;
a[15] := Char(63);
Pmy_array^[0] := 'a';
showmessage(a[0]);
end;
说到这里,你应该明白了第一个例子通不过,而第二个例子可以通过了吧