Pointer(@k)与Pointer(k)有什么区别?
TForm1 = class(TForm)
btn1: TButton;
btn2: TButton;
procedure FormCreate(Sender: TObject);
procedure btn1Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure btn2Click(Sender: TObject);
private
{ Private declarations }
MyList: TList;
MyTmp: Integer;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
MyList := TList.Create;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
MyList.Clear;
MyList.Free;
end;
procedure TForm1.btn1Click(Sender: TObject);
var
k: Integer;
p: PInteger;
begin
Randomize;
k := Random(MaxInt);
MyTmp := k;
MyList.Add(Pointer(@k));//添加k的引用
MyList.Add(Pointer(k));//???????
end;
procedure TForm1.btn2Click(Sender: TObject);
var
k1,k2: Integer;
begin
k2 := Integer(MyList[1]);
Assert(k2 = MyTmp,'k2 <> MyTmp');
k1 := PInteger(MyList[0])^;
Assert(k1 = MyTmp,'k1 <> MyTmp');
end;
[解决办法]
MyList.Add(Pointer(@k));//添加k的引用
MyList.Add(Pointer(k));//???????
这二句没有什么区别!
因为:@K取到地址,然后在这POINTER指向K的地址。
而Pointer(k)直接指向K的数据地址。
@K 是取数据的地址
而Pointer是返回数据的指向地址!
[解决办法]
不好意思,只是测试一下,上面。
var
K: Integer;
P: PInteger;
设:
K := 10; @K ==> 1000;
则:
List.Add(@K); 是将K的地址(1000)加入到List中
List.Add(Pointer(K)); 是将K的内存(10)加入到List中
MyList是类变量,而你的K和@K是局部变量,如果这样处理,在其它地方引用到1000(可能变为野指针)地址引用的值,则不可预的事就多了。
[解决办法]
MyList.Add(Pointer(@k));
把k的地址保存到MyList
MyList.Add(Pointer(k));
把k的值保存到MyList,因为TList的Add方法参数是pointer类型,所以强制把k的值转换成pointer,仅此而已。