首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

Delphi System.TPtrWrapper 結構體詳解:64 位相容指標包裝器

     編輯:Delphi

背景

Delphi 新版 System 單元引入 TPtrWrapper 記錄型別,解決 32/64 位指標與整數互轉的型別安全問題。傳統 Integer(P)、Pointer(Int) 在 64 位下會截斷,TPtrWrapper 提供型別安全的封裝,編譯器幾乎視同原生指標使用。

完整功能測試代碼


procedure TForm1.FormCreate(Sender: TObject);
var
  num: Integer; p: Pointer; addr: NativeInt;
  PW1, PW2, PW3: TPtrWrapper; b: Boolean;
begin
  p := @num;
  // 建構方式 1:從指標
  PW1 := TPtrWrapper.Create(p);
  addr := PW1.ToInteger; // 取得地址整數

  // 建構方式 2:從地址整數
  PW2 := TPtrWrapper.Create(addr);
  PInteger(PW2.ToPointer)^ := 123; // 寫入數值
  ShowMessage(IntToStr(num)); // 123

  // 建構方式 3:空值
  PW3 := TPtrWrapper.NilValue;

  // 相等比較 (運算子多載)
  b := PW1 = PW2; ShowMessage(BoolToStr(b, True)); // True
  b := PW1 <> PW3; ShowMessage(BoolToStr(b, True)); // True

  // 直接作為指標使用 (記錄第一欄位即指標)
  p := Pointer(PW1);
  ShowMessage(IntToStr(PInteger(p)^)); // 123

  // 強制轉換
  PW3 := TPtrWrapper(addr);
  ShowMessage(IntToStr(Integer(PW3))); // 類似 1244823
end;

關鍵特性總結

特性說明
Create(Pointer)從指標建構
Create(NativeInt)從地址整數建構
NilValue空指標單例
ToInteger取得 NativeInt 地址
ToPointer取得原始 Pointer
運算子 = / <>指標值比較
隱含轉換可直接賦值給 Pointer / NativeInt
記錄結構無額外開銷,第一欄位即原始指標

適用場景

  • 跨平台 (Win32/Win64) 共用代碼中指標與整數互轉
  • 需對指標進行算術、比較、哈希、序列化的場合
  • 替代 PtrUInt/PtrInt 等舊式型別,獲得編譯器檢查

建議:新代碼全面採用 TPtrWrapper 取代裸指標整數轉換,提升 64 位相容性與程式碼可讀性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved