unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private { Private declarations }
public
{ Public declarations }
end; TTest = class
Button1: TButton;
private
fConnect:Integer;
{ Private declarations }
public
procedure change( aState:PInteger);
procedure change2;
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}{ TTest }procedure TTest.change( aState: PInteger);
begin
fConnect := 1;
aState := @fConnect; //这句为什么编译器不执行(问题的关键) ???
end;procedure TTest.change2;
begin
fConnect := 2;
end;procedure TForm1.Button1Click(Sender: TObject);
var
vT:TTest;
vState:PInteger;
i,j:Integer;
begin
j := 0;
i:= 10;
vState := @i; j := vState^ ;
ShowMessage(InttoStr(j)); //正确的得到值 10 vT := TTest.Create;
vT.change(vState);
// 期望得到1 怎么做 ???
j := vState^;
ShowMessage(InttoStr(j)); vT.change2;
// 期望得到2 怎么做 ???
j := vState^ ;
ShowMessage(InttoStr(j));end;
end.
begin
fConnect := 1;
aState := @fConnect; //这句为什么编译器不执行(问题的关键) ???///////change(var aState:Pinteger);否则编译器优化掉了这句。
end;
aState^=:fConnect;
改成procedure change(var aState:PInteger);吧。你试试,是不是你想要的结果
procedure TTest.change( aState: PInteger);
begin
fConnect := 1;
aState := @fConnect; //这句为什么编译器不执行(问题的关键) ???
end;楼主对指针的理解有问题,你用这句话vT.change(vState)调用的时候,调用不会影响vState,可以理解为编译器在调用Change的时候,会对vState进行复制,生成另外一个vState_1然后传入Change当参数,你用aState := @fConnect; 实际是改变了vState_1,而没有改变vState的值,你改为change(var aState: PInteger)就可以了,当然aState := @fConnect这句也就被优化了。对于这种指针的指针一定要概念清楚,另外楼主的代码风格需要改进一下,格式写清楚,这样看你的代码就不会觉得别扭了。
begin
fConnect := 1;
aState := @fConnect; //这句为什么编译器不执行(问题的关键) ???end; 就加個VAR 引用就行了吧