Delphi中的动态数组和指针 如何在Delphi中重写这个C++代码?< /P> int *intim = new int[imsize]; unsigned char *grays = new unsigned char[imsize]; int *intim2 = intim;
如何像这样递增指针:Delphi中的动态数组和指针 如何在Delphi中重写这个C++代码?< /P> int *intim = new int[imsize]; unsigned char *grays = new unsigned char[imsize]; int *intim2 = intim;,delphi,Delphi,如何像这样递增指针: *(intim++) = x; 在Delphi中,您可以使用指针(如在C/C++中),但通常会尝试避免使用指针 代码看起来最像 uses Types; procedure Test(); var intim: TIntegerDynArray; grays: TByteDynArray; P: PInteger; i, s: Integer; begin // 'allocate' the array SetLength(intim
*(intim++) = x;
在Delphi中,您可以使用指针(如在C/C++中),但通常会尝试避免使用指针 代码看起来最像
uses
Types;
procedure Test();
var
intim: TIntegerDynArray;
grays: TByteDynArray;
P: PInteger;
i, s: Integer;
begin
// 'allocate' the array
SetLength(intim, imsize);
SetLength(grays, imsize);
// if you want to walk through the array (Delphi style)
for i := Low(intim) to High(intim) do intim[i] := GetValueFromFunction();
// or (read only access, sum the array)
s := 0;
for i in intim do Inc( s, i );
// or with pointers:
P := @intim[ 0 ];
for i := 0 to High(intim) do begin
P^ := x;
Inc( P ); // like P++;
end;
end;
最好的方法是使用数组。如果imsize是常量,则需要静态数组,否则将使用动态数组。以下是两者的语法: 静态:
var
intim: array[0..imsize - 1] of integer;
动态:
var
intim: array of integer;
begin
setLength(intim, imsize);
//do something with intim
end;
至于灰色,如何声明它取决于将“无符号字符”数组用作字符(字符串)还是用作单字节整数。如果它们是整数,则可以将无符号单字节整数声明为byte
,并使用上述语法声明它们的数组(静态或动态)。如果它们是字符,只需使用字符串
类型
指针数学是可能的,但不推荐使用,因为它太容易造成缓冲区溢出。相反,尝试将另一个变量声明为
整数
,并将其用作数组的索引。如果您启用了边界检查,这将防止您超出数组末尾并损坏内存。指出您应该使用数组类型,而不是像您在C中看到的那样使用直接指针操作的人是正确的,对于Delphi来说,在安全数组更容易、验证速度更快、运行时更安全的情况下,使用危险的指针类型并不是惯用做法。然而,对于那些想要避免使用漂亮的内置数组类型的学究来说,这样做是可能的,尽管很愚蠢:
var
intim,intim2:PInteger;
x:Integer;
begin
x := 0;
intim := AllocMem(SizeOf(Integer)*imsize);
intim2 := intim;
// dereference pointer intim2, store something, then increment pointer
intim2^ := x;
Inc(intim2);
FreeMem(intim);
我第一次发布这段代码时,它分配内存,存储,然后递增,然后释放一个与我从分配器收到的指针不同的指针。那可能很糟糕。(修正!)不要使用:=0到高(xxx)你应该使用:=Low(xxx)到高(xxx)如果你习惯了这一点,如果你突然遇到一个定义为整数[10..20]的数组,你永远不会遇到麻烦。所以-习惯使用低和高-最终会有回报的…@heartware:你是对的,我已经习惯了我们严格的政策,除了基于零的阵列之外,绝不使用任何其他阵列。作为对Kowalikus的警告:数组并不总是零基的!动态数组(如上面的示例中所示)始终是基于零的。但是,字符串是基于1的,以便与上个世纪的古老Pascal版本兼容。