var p3:pointer S:String; I:Integer; begin p1:= Pointer(S); p2:= @S; P3:= pchar(s);
// p1 和 p2 p3 有什么区别吗?
procedure TForm1.FormCreate(Sender: TObject); begin s:='abcdef'; end; 我们用这种方式来赋值 s 是一个全局变量
p1:=Pointer(S);
45ecd8 是s 的指针的指针 所以这2句话是 指针的复制
p2:= @S;
指针的指针 赋值给 指针
p3:=pchar(s);
call 404ca4在下面
和第一个类似 就是把string中的数据(去掉引用计数和大小 之外的数据) 指针
复制了一份
不过 以上3中情况 汇编中 都没有引用 string的指针 全部都是直接引用 string 去掉引用计数和大小的指针 也就是后移12个字节 (大小+引用计数
+长度)的指针
看起来 delphi 对全局变量string的引用 是指针调用
如果把s:integer的话 结果是
p1:=Pointer(S); 图1 就是 指针中的值 复制到另一个指针中做数值 也就是 传递了 数值
p2:= @S; 图2 是传递了指针
另外 有趣的是 如果s 作为局部变量 3种代码 反汇编是一模一样的 都采用经典的 xchge [eax],edx 形式 [eax],为栈地址
p3:=pchar(s); 图3 类似图1
|
请发表评论