System.TPtrWrapper:指针包装器

不知什么时候 System 单元有了 TPtrWrapper 结构体, 它提供了非常小的一点功能: 指针(Pointer)与指针地址(NativeInt)的转换. 很显然, 以前常用的 Integer(P) 或 Ptr(Number) 已经不适用与 64 位了, 这时使用 TPtrWrapper 应该是更方便,更保险的选择. 发现在 Delphi 新的源码中, 几乎就把 TPtrWrapper 当做指针来使用了.

{TPtrWrapper 全功能测试}procedure TForm1.FormCreate(Sender: TObject);
var
  num: Integer;
  p: Pointer;
  Address: NativeInt;
  PW1,PW2,PW3: TPtrWrapper;
  b: Boolean;
begin
  p := @num;

  //建立方法 1
  PW1 := TPtrWrapper.Create(p);
  Address := PW1.ToInteger;           //ToInteger

  //建立方法 2
  PW2 := TPtrWrapper.Create(Address);
  PInteger(PW2.ToPointer)^ := 123;    //ToPointer
  ShowMessage(IntToStr(num)); //123

  //建立方法 3
  PW3 := TPtrWrapper.NilValue;

  //Equal 运算
  b := PW1 = PW2;
  ShowMessage(BoolToStr(b, True));

  //NotEqual 运算
  b := PW1 <> PW3;
  ShowMessage(BoolToStr(b, True));

  //作为结构的 TPtrWrapper, 其起始位置存放的就是指针
  p := Pointer(PW1);
  ShowMessage(IntToStr(PInteger(p)^)); //123

  //既如此, 也就可以直接把一个地址数, 或指针直接强制转换为 TPtrWrapper 了
  PW3 := TPtrWrapper(Address);
  ShowMessage(IntToStr(Integer(PW3))); //类似于 1244823end;

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索指针
, 方法
, integer
, 运算
address
,以便于您获取更多的相关知识。

时间: 2024-12-31 10:55:37

System.TPtrWrapper:指针包装器的相关文章

【C/C++学院】0816-引用包装器/仿函数/转义字符 R”()”/using别名/模板元编程 比递归优化/智能指针/多线程/静态断言以及调试技能的要求 assert

引用包装器  std::ref(变量) #include<iostream> template<class T> void com(T arg)//模板函数,引用无效,引用包装器 { std::cout <<"com ="<< &arg << "\n"; arg++; } void main() { int count = 10; int & rcount = count; com(coun

【C/C++学院】0815-函数包装器/CPP类型转换/函数模块/动态数组

函数包装器管理内嵌函数 #include<iostream> #include<functional> //函数包装器 //第一,设计执行接口,接口设计关卡(),计数 //第二,函数包装器依赖于函数模板,实现通用泛型 //第三,函数代码可以内嵌在另外一个函数,实现函数怀孕 //函数包装器,用于管理内嵌函数,外部函数调用 //函数包装器, T数据类型, F是函数 template<typename T,typename F> T run(T v, F f) { stati

Java千百问_06数据结构(003)_什么是基本类型包装器

1.什么是包装器 包装器也叫包装类,继承于Object,可以当作8种基本数据类型的类映射,包装器可以直接转换为基本数据类型(成为拆箱).如下:  了解8种基本数据类型看这里:java有哪8种基本数据类型 2.包装器有什么作用 包装器描述了基本数据类型的若干属性,包括基本类型的取值范围以及长度等.  例子: public class PrimitiveTypeTest { public static void main(String[] args) { // byte System.out.pri

【C/C++学院】0825-类模板/final_override/类模板与普通类的派生类模板虚函数抽象模板类/类模板友元/位运算算法以及类声明/Rtti 实时类型检测/高级new创建/类以及函数包装器

类模板 类模板多个类型默认类型简单数组模板 #pragma once template <class T=int>//类模板可以有一个默认的值 class myArray { public: myArray(); ~myArray(); }; #include "myArray.h" template <class T=int>//每一个函数都需要加上一个默认的值 myArray<T>::myArray() //类模板成员函数在外部,需要加载类型初始

函数包装器,函数私有类处理

 1.函数包装器 #include<iostream> #include<functional>   //函数包装器 //第一,设计执行接口,接口设计关卡(),计数 //第二,函数包装器依赖于函数模板,实现通用泛型 //第三,函数代码可以内嵌在另外一个函数,实现函数怀孕 //函数包装器,用于管理内嵌函数,外部函数调用   //函数包装器, T数据类型, F是函数 template<typename T, typename F> T run(T v, F f) {  

如何编写 Spring Roo 的高级附加组件和包装器附加组件

本系列 "Spring Roo 简介" 的 Spring Roo 简介,第 3 部分:开发 Spring Roo 的附加组件 讨论了 Spring Roo 附 加架构,以及如何使用 addon create 命令创建国际化的.简单的附加组件.本文主要关注 Spring Roo 支持的其余两种类 型的附加组件,即高级附加组件和包装器附加组件.建议您在开始阅读本文之前先阅读第 3 部分的文章. 高级附加 组件的简介 高级附加组件允许 Spring Roo 执行简单附加组件所能执行的一切操作

IBM InfoSphere Federation Server V9.7中JDBC包装器的应用

联邦数据库的基本概念 联邦数据库是一个特殊的分布式数据管理系统,它是由一组数据源组成,其中由一个 DB2 数据库担当联邦服务器,对其他的数据源的操作都可以看作是在服务器上进行,并且这些通过联邦系统对其他数据源的操作不会影响这些数据源各自的独立性和完整性. 联邦数据库具有以下特点: 透明性:底层的多个数据源对用户而言是透明的,所有的对这些数据源的操作都像是在一个 DB2 数据库中进行的. 异构性:可以满足企业环境下不同的数据以及数据源需求. 扩展性:联邦数据库提供了一些接口,可以通过实现这些接口灵

《jQuery Cookbook中文版》——1.5 过滤DOM元素包装器集

1.5 过滤DOM元素包装器集 1.5.1 问题 在jQuery包装器集中有一组选中的DOM元素,但是打算从集合中删除不匹配新指定表达式的元素,以创建一个新的操作元素集合. 1.5.2 解决方案 jQuery过滤器方法用于DOM元素的jQuery包装器集,可以排除不符合指定表达式的元素.简言之,可以用filter()方法过滤当前元素集,这是过滤器方法与jQuery查找方法的重要区别,查找方法通过寻找(使用新的选择器变量)新元素(包括当前包装器集的子元素)来缩小DOM元素的包装器集. 为了理解过滤

《jQuery Cookbook中文版》——1.6 查找当前选择包装器集中的后代元素

1.6 查找当前选择包装器集中的后代元素 1.6.1 问题你选择了一组(或者一个)DOM元素,希望在当前选中元素的上下文中找到后代(子)元素. 1.6.2 解决方案使用.find()方法,根据当前集合及其后代的上下文创建一个新的元素包装器集.例如,假设你有一个包含多个段落的网页,这些段落中封装的是需要强调(以斜体显示)的单词.如果你只想选择 元素中包含的元素,可以使用如下代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitiona