delphi中指针的理解与使用

尽管指针在Delphi中不如C或C++那样重要,但它们是一种“基本”工具,几乎所有与编程有关的事情都必须以某种方式处理指针。...

尽管指针在Delphi中不如C或C++那样重要,但它们是一种“基本”工具,几乎所有与编程有关的事情都必须以某种方式处理指针。

Illustration of computer programming

正是由于这个原因,您可能会了解到字符串或对象实际上只是一个指针,或者像OnClick这样的事件处理程序实际上是一个指向过程的指针。

指向数据类型的指针

简单地说,指针是一个变量,它保存内存中任何内容的地址。

要具体说明这个定义,请记住应用程序使用的所有内容都存储在计算机内存中的某个位置。因为指针持有另一个变量的地址,所以可以说它指向该变量。

大多数情况下,Delphi中的指针指向特定类型:

variValue, j : integer;pIntValue : ^integer;beginiValue := 2001;pIntValue := @iValue;...j:= pIntValue^;end;

声明指针数据类型的语法使用插入符号(^)。在上面的代码中,iValue是一个整型变量,pIntValue是一个整型指针。由于指针只不过是内存中的一个地址,因此我们必须将存储在iValue integer变量中的值的位置(地址)分配给它。

@operator返回一个变量(或函数或过程)的地址,如下所示。与@运算符等效的是Addr函数。请注意,pIntValue的值不是2001。

在这个示例代码中,pIntValue是一个类型化的整数指针。好的编程风格是尽可能多地使用类型化指针。指针数据类型是通用指针类型;它表示指向任何数据的指针。

请注意,当“^”出现在指针变量之后时,它反引用指针;也就是说,它返回存储在指针持有的内存地址上的值。在本例中,变量j的值与iValue的值相同。当我们可以简单地将iValue分配给j时,这看起来似乎毫无意义,但这段代码隐藏在大多数WinAPI调用的背后。

零指针

未分配的指针是危险的。由于指针允许我们直接使用计算机内存,如果我们试图(错误地)写入内存中受保护的位置,我们可能会遇到访问冲突错误。这就是我们应该始终初始化指向NIL的指针的原因。

NIL是一个特殊常数,可以指定给任何指针。将nil指定给指针时,指针不引用任何内容。例如,Delphi提供了一个空的动态数组或一个长字符串作为nil指针。

字符指针

基本类型PAnsiChar和PWideChar表示指向AnsiChar和WideChar值的指针。通用PChar表示指向Char变量的指针。

这些字符指针用于操作以null结尾的字符串。将PChar视为指向以null结尾的字符串或表示该字符串的数组的指针。

指向记录的指针

定义记录或其他数据类型时,通常也会定义指向该类型的指针。这使得在不复制大内存块的情况下操作该类型的实例变得很容易。

拥有指向记录(和数组)的指针的能力使建立复杂的数据结构(如链表和树)变得更加容易。

typepNextItem = ^TLinkedListItemTLinkedListItem = recordsName : String;iValue : Integer;NextItem : pNextItem;end;

链表背后的想法是让我们能够将下一个链接项的地址存储在NextItem记录字段中的列表中。

例如,在存储每个树视图项的自定义数据时,也可以使用指向记录的指针。

过程和方法指针

Delphi中另一个重要的指针概念是过程和方法指针。

指向过程或函数地址的指针称为过程指针。方法指针类似于过程指针。但是,它们必须指向类方法,而不是指向独立过程。

方法指针是一个指针,它包含有关被调用的名称和对象的信息。

指针和windows api

在Delphi中指针的最常用的用法是连接到C和C++代码,其中包括访问Windows API。

Windows API函数使用了许多Delphi程序员可能不熟悉的数据类型。调用API函数中的大多数参数都是指向某些数据类型的指针。如上所述,在调用Windows API函数时,我们在Delphi中使用以null结尾的字符串。

在许多情况下,当API调用返回缓冲区中的值或指向数据结构的指针时,应用程序必须在进行API调用之前分配这些缓冲区和数据结构。SHBrowseForFolder Windows API函数就是一个例子。

指针和内存分配

指针的真正威力来自于在程序执行时留出内存的能力。

这段代码应该足以证明使用指针并不像一开始看起来那么困难。它用于使用提供的句柄更改控件的文本(标题)。

procedure GetTextFromHandle(hWND: THandle) ;var pText : PChar; //a pointer to char (see above)TextLen : integer;begin{get the length of the text}TextLen:=GetWindowTextLength(hWND) ;{alocate memory}GetMem(pText,TextLen) ; // takes a pointer{get the control's text}GetWindowText(hWND, pText, TextLen + 1) ;{display the text}ShowMessage(String(pText)){free the memory}FreeMem(pText) ;end;

  • 发表于 2021-09-21 12:36
  • 阅读 ( 254 )
  • 分类:编程

你可能感兴趣的文章

程序员指针简介

...意识到与否,你所使用的绝大多数程序都以某种方式使用指针。也许您在某个时候遇到过NullPointerException。作为程序员,您编写的代码很可能会使用指针,即使您自己没有实现它们。 ...

  • 发布于 2021-03-15 04:42
  • 阅读 ( 178 )

为什么德尔福和美孚眼认为他们有自动驾驶汽车的秘方

德尔福(Delphi)和美孚眼(Mobileye)这两家领先的汽车零部件供应商,在自动驾驶领域的知名度不如其更大的竞争对手谷歌(Google)和特斯拉(Tesla)。但通用汽车(GM)在英国的子公司德尔福(Delphi)已经展示了三年多的自主技...

  • 发布于 2021-05-08 21:20
  • 阅读 ( 189 )

指针(pointer)和参考(reference)的区别

指针和引用都是C和C++中最强大的特性,它允许程序员直接处理内存地址,以进行高效的内存管理。 两者都是用于间接引用其他对象的变量,它们在曲面上具有一些共同的特征。虽然它们有很多共同的功能,但理解起来也非常复...

  • 发布于 2021-06-25 06:41
  • 阅读 ( 454 )

新的(new)和C++中删除运算符(delete operator in c++)的区别

C++中new和Delphi运算符的主要区别在于new被用来为对象或数组分配内存,而DELATE用于释放使用新运算符分配的内存。 有两种类型的记忆作为静态和动态记忆。假设一个语句,比如int a;int数组[10];程序员已经知道这些变量需要多...

  • 发布于 2021-07-01 04:35
  • 阅读 ( 179 )

delphi编译器版本指令

如果您计划编写可以与多个版本的Delphi编译器一起使用的Delphi代码,您需要知道您的代码是在哪个版本下编译的。 假设您正在编写自己的商业自定义组件。组件的用户可能具有与您不同的Delphi版本。如果他们试图重新编译组...

  • 发布于 2021-09-06 15:09
  • 阅读 ( 161 )

使用delphi的键入文件文件创建数据库

简单地说,文件是某种类型的二进制序列。在Delphi中,有三类文件:类型化、文本和非类型化。类型化文件是包含特定类型数据的文件,例如双精度、整数或以前定义的自定义记录类型。文本文件包含可读的ASCII字符。当我们想...

  • 发布于 2021-09-06 15:11
  • 阅读 ( 170 )

理解delphi项目和单元源文件

简而言之,Delphi项目只是组成由Delphi创建的应用程序的文件集合。DPR是用于Delphi项目文件格式的文件扩展名,用于存储与项目相关的所有文件。这包括其他Delphi文件类型,如表单文件(DFM)和单元源文件(.PASs)。 由于Delphi...

  • 发布于 2021-09-06 15:15
  • 阅读 ( 172 )

程序退出时delphi中的内存泄漏通知

自Delphi 2006以来的所有Delphi版本都有一个更新的内存管理器,该管理器速度更快,功能更丰富。 “新”内存管理器最出色的功能之一是允许应用程序注册(和注销)预期内存泄漏,并在程序关闭时报告意外内存泄漏。 使用De...

  • 发布于 2021-09-06 15:15
  • 阅读 ( 165 )

如何delphidbgrid中的记录排序(sort records in delphi dbgrid)

Delphi DBGrid是一个功能强大的组件,如果您正在开发数据感知应用程序,那么您可能每天都在使用它。下面,我们将了解如何向您的数据库应用程序中添加更多用户肯定会喜欢的功能。 按照《Delphi数据库编程初学者指南》中描...

  • 发布于 2021-09-10 22:31
  • 阅读 ( 231 )

在系统托盘中放置delphi应用程序

...还有其他图标吗?这个地方叫做Windows系统托盘。您想将Delphi应用程序的图标放在那里吗?您希望该图标设置动画还是反映应用程序的状态? 这对于长时间运行而没有用户交互的程序(通常整天都在电脑上运行的后台任务)非...

  • 发布于 2021-09-11 00:20
  • 阅读 ( 177 )
我是兲啊
我是兲啊

0 篇文章

相关推荐