var p1,p2,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