Delphi中Pointer的使用


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM