首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

Pointer(@k)与Pointer(k)有什么区别?解决办法

2012-02-08 
Pointer(@k)与Pointer(k)有什么区别?TForm1 class(TForm)btn1: TButtonbtn2: TButtonprocedure FormCr

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,仅此而已。

热点排行