Delphi指针大全

 

Delphi

 

 

       

1 DELPHI 的指针-引用 ................................................................................. - 1 -

2 delphi 引用/模型 .............................................................................. - 5 -

3 谈谈  Delphi 的类型与指针 .................................................................... - 13 -

4 Delphi 7  指针数据类............................................................................ - 17 -

5 delphi 中的 Pchar 指针 ............................................................................. - 19 -

 

 

 

 

1 DELPHI 的指-引用

 

 

大家都认为C 语言所以强大以及其由性大部分体在其灵的指针用上 此,说指针是 C 语言灵魂,点都不过。同,这种说也让很人产生解,似乎 只有 C 语言指针才算指针。Basic 不支持在此不论其实,Pascal 语言身也 是支持指初的 Pascal 发展今的 Object Pascal可以说在指运用上丝毫不 会逊色于 C 语言指针。

 

 

以下内容为八个分,分 一、类型针的定义 二、无类指针的 三、指针解除引用 四、取地(指针值) 五、指针

六、动态存分配 七、字符组的运算 八、函数

 

 

 

 

一、类型针的定。对于向特定型的指,在 C 中是样定义

 

int *ptr;

 

char *ptr;

与之等价的 Object Pascal 是如定义的

 

var

 

ptr : ^Integer;

 

ptr : ^char;

其实也就符号的别而已。

 

 

 

- 1 -


 

Delphi

 

 

二、无型指针C  void *,也就可以指向何类型据的指Object

Pascal 为其定义了个专门类型:Pointer。于

 

ptr : Pointer;

就与 C

 

void *ptr;

等价了。

 

 

三、指针解除引。要解指针引(即取所指区域值),C 的语  (*ptr)

Object Pascal 则是 ptr^

 

 

四、取地(指针值)。某对象地址并值给指针量,C 的语法是

 

ptr = &Object; Object Pascal 则是

 

ptr := @Object;

也只是符的差别已。

 

 

五、指针算。在 C 中,以对指进行移的运,如:

 

char a[20]; char *ptr=a; ptr++; ptr+=2;

当执行 ptr++;译器产生让 ptr  sizeof(char)的代ptr 将指向 a[1]

ptr+=2;这句使得 ptr 前进 sizeof(char)小的步我们看一下 Object Pascal

中如何实

 

var

 

a : array [1..20] of Char;

ptr : PChar; //PChar 可以看作  ^Char begin

ptr := @a;

Inc(ptr); // 等价于 C ptr++; Inc(ptr, 2); //这句等  C ptr+=2;

 

end;

 

 

六、动态存分配。C 中,使用 malloc()库函内存free()函数释内存。这样的 代码:

 

int *ptr, *ptr2;

 

 

- 2 -


 

Delphi

 

 

int i;

 

ptr = (int*) malloc(sizeof(int) * 20);

 

ptr2 = ptr;

 

for (i=0; i<20; i++){

 

*ptr = i;

 

ptr++;

 

}

 

free(ptr2);

Object Pascal 中,动态分内存函数是 GetMem(),与之对的释放数为 FreeMem()

(传统 Pascal 获取内的函 New() Dispose(),但 New()只能得对象单个实 体的内存小,无取得连的存放个对象块)。因,与上那段 C 码等 价的  Object Pascal 的代码为:

 

var ptr, ptr2 : ^integer;

 

i : integer;

 

begin

 

GetMem(ptr, sizeof(integer) * 20);

//这句等价于 C ptr = (int*) malloc(sizeof(int) * 20);

ptr2 := ptr; //保留原始指位置

 

for i := 0 to 19 do begin

ptr^ := i; Inc(ptr); end;

FreeMem(ptr2);

 

end;

对于以上个例子无论是 C 版本,还是 Object Pascal 版本的),要注一个问题, 就是分配存的单是字BYTE),因此使用 GetMem 第二个数如想当然 的写成  20那么就出问题内存访越界)。 GetMem(ptr, 20);实际分配了 20 个字节的存空间一个整的大小四个字节那么访问五个之的所有素都是非 法的了( malloc()参数同)。

 

 

字符数组运算C 语言中没有字串类因此字符都是用符数组 现,于是有一套 str 打头库函数进行字的运算,以下代

char str[15]; char *pstr; strcpy(str, "teststr");

 

 

- 3 -


 

Delphi

 

 

strcat(str, "_testok");

 

pstr = (char*) malloc(sizeof(char) * 15);

 

strcpy(pstr, str); printf(pstr); free(pstr);

而在 Object Pascal 有了 String 此可以方便的对符串进各种运但是,

有时我们的 Pascal 码需要与 C 码交(比  Object Pascal 的代码 C DLL 或者用 Object Pascal DLL 准备许用 C 客户端的的话就不能使 String 类型了须使用种语言用的符数组。其实,Object Pascal 提供完全相似 C 一整套字数组的算函数以上那代码的 Object Pascal 版本是这样的:

 

var str : array [1..15] of char;

pstr : PChar; //Pchar 也就是  ^Char begin

StrCopy(@str, ’teststr); // C ,数组名称可以直接作为组首地指针来用

// Pascal 不是这样的因此  str 前要加取地址运算符

 

StrCat(@str,_testok’); GetMem(pstr, sizeof(char) * 15); StrCopy(pstr, @str);

Write(pstr); FreeMem(pstr); end;

 

八、函数针。在态调用 DLL 中的函数,就会到函数指。假设用 C 一段代码 如下:

typedef int (*PVFN)(int); //定义函指针类型

 

int main()

 

{

 

HMODULE hModule = LoadLibrary("test.dll"); PVFN pvfn = NULL;

pvfn = (PVFN) GetProcAddress(hModule, "Function1");

 

pvfn(2); FreeLibrary(hModule);

}

就我个人觉来C 言中定函数指类型的 typedef 代码语法有而同 代码在 Object Pascal 中却非常懂:

 

type PVFN = Function (para : Integer) : Integer;

 

 

- 4 -


 

Delphi

 

 

var

 

fn : PVFN;

//也可以直接在处定,如fn : function (para:Integer):Integer;

 

hm : HMODULE;

 

begin

 

hm := LoadLibrary(test.dll);

 

fn := GetProcAddress(hm, Function1’);

 

fn(2); FreeLibrary(hm); end;

 

 

 

附:

Delphi 指针功非常强,所有 c 中能现的 Delphi 中都能. 上面 Delphi

指针不是项的只一种误(对指针机制一半解).

由于 Pascal 言的限制, Delphi 的指针很多况下需要制类型. Delphi 了很多指类型, 非常方便的是你以自定义自己的指针.

个经: 握一数据类并且够灵,比较的办法别考什么类 什么名字, 而只需要考虑这种类型变量将占用多字节. 凡是字节数相同的类型都可以  :-), 只是 便的 . : Integer, Pointer, PChar, TSmallPoint 甚至  array [0..4] of Char 你都可以把们当成同一类加以使用(有了这思路, 实现很的程序活性和代 码高效性). 所以我不理解 JAVA 中不支持指针(因此我认为用 JAVA 绝对可能写 出很高效程序, 会有很多 C/C++/DELPHI 一句话可完成的作在 JAVA 中需 要用一个复杂过程, 消耗很多额外内存才能达到相同目的). 就事论事, 根据你的问题 Delphi C 的解决案没什两样.

 

 

 

http://hi.baidu.com/sswanglei/blog/item/3b55d88bcab41d14c8fc7a94.html

 

 

 

 

 

 

2 delphi 引用/模型

 

 

D 中简的数据类型(如 integer,charrecord 无论作为数还是量都是值传递和 使用的通常为值类型类型也直接类型每个变量有自己存储数的实际的

 

 

 

- 5 -


 

Delphi

 

 

内存空间更改了量也就接更改它的数

D 中复杂的数(如 class)按引用递和使用的用类型间接类型 存储的是接数据堆该数的引可以理解为指针),是存储是实际据数据 存储内存地址。

这两种变量参数传递候,值类型传递的是值的副本,用类型传递是引用 的副本值类数据存在栈中而引用类型数据存放堆中器直接使用栈指 针分配和访问内存把对象储在堆中象的引用值类型放在栈中为值 类型和对的引用以确定大小和命期是对象无法确其大小生命期编译器 无法知道象要从中分配少内存占用多内存时间所以栈中的量不需要 程序员手释放中的变需要程员手工分配空间和销毁程序中过对象用来访 问对象,变对象用无法变对象身。

 

 

D 中对引用和引用 一个对象引用就是一个句柄或指针,当你分配一个对象引用给一个变量时候,D

复制引用而不是个对象当程序再使用时候,应该 free 显式其销毁一个 对象引用常以一变量形存在,也有函属性返回的形式。

同一个类创建对象,过类引都指向同一个类表。

 

someobj:=Tobj.create;

someobj 就是象引,而 Tobj 类引用。

 

 

类引用类型是类的class of class类型,也称元类(metaclass)。构造形 式为class of typetype 为任何。类引用类的声明不直接用变量或参数声明 可以把 nil 值给任类引用如果类看对象的模板么元类是类的板。

类引用是引用个具体的表达。类引 D 中用生成新象、调类方 已经测试者转换象类型引用实为指向一个关于该类信息表指针是类的 虚方法表(VMT)。通常,类用的函数是一个类的名称,但也可以是类型元类的变量, 或者返回类引用函数或性。

 

 

D 中的象传递

D ,参数递机制值传递引用传。值传递递的是值参数默认), 引用传递递的是量参数var)。

function getsome(x:integer):integer; 传递

function getany(var x:integer):integer; 引用

值传递 getsome(a);生的 x a 的一个数值数此就好像一个局 其变化不 a 的值但是用传递 getany(a)中产生的 x 是指向 a 变量参数 在函数中化,直影响到 a 。引传递时候,要注意变参数及传递给个参数,

 

 

- 6 -


 

Delphi

 

 

也不会创他的副。引用递能改传给它的值。

总之,按值传时候,参和实是两个变量;引用传的时候同一个量。 意的是,对在做为参传递的时候,由于我们在传递对的时候,实上传递

的都是对的引用象作为数传递时候无论是采值传递是引用 递的都是象的引,不同是值传会产生用的副本相当于对象的个别名, 绑定的是一个对),但如果修形参的是会修改参的值。

 

 

D 中对的克隆

TPersistent 类下的所有对象是可以

:=赋值操作符是将一对象引赋值给一个对象变当于了一个实体 对象只有个);

assign assignto 方法可以将对属性进赋值,得两个状一样的象。(实 实在在的制,内×2,实体象有两)。

 

 

 

 

 

 

Delphi 针大全

 

 

Delphi 针理解 看一个指用法的子:

 

1                  var

2                         X,       Y:       Integer;              //       X       and       Y       整数类型

3                         P:       ^Integer;                     //       P       指向数类的指针

 

4                  begin

5                         X       :=17; //              X       赋值

6                         P       :=       @X;                                   //              x 地址赋给 p

7                         Y       :=       P^;                                    //        p 向的数赋给

 

y

 

8                  end;

 

 

第二行义了两变量 X,y.       第三行声明了 p 指向整数型的指针;味着 p 够指

x 或者 y 的地址.行赋给 x ,第六 x 址赋给 p. 后通过 p 的变量值给 y.此时,x y 有相的值.

操作@取出变的地址,以取出函数的地址.

 

 

- 7 -


 

Delphi

 

 

 

 

而符号^有两个目标,

当它出在类型义的前时如  ^typename 指向这种型的指针;

当它出在指针量后边时       point^ 返回指针指向的量的值;

 

 

理解指比较容理解面对象的 pascal 语言,为指针经在幕后.任何要动态 分配大的存空间类型可用指针.例如

 

 

,long-string ,实际在使用指针行操作.些高级的程技术要使用针类型.

有时指针是适应 object      pascal 严格的类型限制的唯一方法.同过一个通用的指针类 ,通过类型换成不的指针,如下的例子:

 

type

 

 


 

 

 

var


PInteger       =       ^Integer;

 

 

 

R:       Single; I:    Integer;

P:       Pointer; //通用的指针

 

PI:       PInteger;


 

 

begin

 

P

:=

@R; //取出 R 的内地址

PI

:=

PInteger(P); //把通类型转成指向整类型的

I

 

end;

:=

PI^;

 

 

当然了,数和整的存储式不同.赋值是原始的二制数 R 贝到 I,而不

进行转换.

 

 

保留字 nil 是一特殊的量可赋给任指针, nil 赋給一个指,指针么也 不指向,是一空指针.

 

 

@符返变量的存中的储地址,\函数\方法;

 

 

1.如果变量,@X 返回的是 x 的地如果译选{$T-}没有打开,返回的一个通 指针,如果编选项打,着返的是 x 类型对的指针.

 

 

 

 

- 8 -


 

Delphi

 

 

2.如果是例(过程\),@F 返回 F 点,@F 的类型一个针。

 

 

3.@类的方中时,则方的名称须有,例如@TMyclass.Dosomething

指针指向 TMyclass dosomething

 

 

 

 

当一个过变量在赋语句的左时,编译器望一个过程值赋值语句右边。这种 赋值使得边的变可以指右边定的过程

 

 

入口点。句话说,以通过该量来引用声的过程或者函,可以直使用参数的 引用。

 

 

 

var

 

 

F:

function(X:

Integer):

Integer;

I:

Integer;

 

 

function       SomeFunction(X:       Integer):       Integer;

 

...

F       :=       SomeFunction;           //       f

I       :=       F(4);                                      //       用所指向函数 在赋值句中,边变量类型决了右程或者方指针解

 

var

 

 

 

F,       G:       function:       Integer; I:       Integer;

function       SomeFunction:       Integer;

 

...

F       :=       SomeFunction;           //       f

G       :=       F;                                                //     F 值拷贝给 G I    :=    G;   //     调用函数

第一句得函数入口,二句将针复三句获得数的返值。 有时候可以这使用

 

- 9 -


 

Delphi

 

 

if       F       =       MyFunction       then       ...;

在这F 出现导一个函编译调用 F 指向的然后调用 Myfunction 比较结果这个规是无论时一个程变量(

 

 

procedural       variable在一个达式中它表示调所指向函数或过程 F 指向个过程没有返值)或者 f 需要参

 

 

数的函,则前的语句产生一编译要比较 F Myfunction 需要用

 

if       @F       =       @MyFunction       then       ...;

@F F 转换成个包含址的无型的指针变,@myfunction 返回 myfunction 的地 址。

获得一过程变的内存址使@@。例如@@F 返回 F 的地址。

 

 

@符通把一个类型的针值赋一个程变量,如:

 

var       StrComp:       function(Str1,       Str2:       PChar):       Integer;

 

...

 

@StrComp       :=       GetProcAddress(KernelHandle,      'lstrcmpi');

调用 GetProcAddres 函数, strcomp 向这个值

任何过变量可赋成 nil示指证么也不向。但是图调用一个 nil 的过程变 量导致一错误,了测试个过程量是否

 

 

,用标的赋值 Assigned

 

if       Assigned(OnClick)       then       OnClick(X);

 

===================================================================

 

======

大家都认为C 语言所以强大以及其由性大部分体在其灵的指针用上 此,说指针是 C 语言灵魂,点都不过。同,这种说也让很人产生解,似乎 只有 C 语言指针才算指针。Basic 不支持在此不论其实,Pascal 语言身也 是支持指初的 Pascal 发展今的 Object Pascal可以说在指运用上丝毫不 会逊色于 C 语言指针。

 

 

以下内容为八个分,分 一、类型针的定义 二、无类指针的 三、指针解除引用 四、取地(指针值)

 

 

- 10 -


 

Delphi

 

 

五、指针

六、动态存分配 七、字符组的运算 八、函数

 

 

 

 

一、类型针的定。对于向特定型的指,在 C 中是样定义

 

int *ptr;

 

char *ptr;

与之等价的 Object Pascal 是如定义的

 

var

 

ptr : ^Integer;

 

ptr : ^char;

其实也就符号的别而已。

 

 

二、无型指针C void *,也就可以指向何类型据的指Object

Pascal 为其定义了个专门类型:Pointer。于

 

ptr : Pointer;

就与 C

 

void *ptr;

等价了。

 

 

三、指针解除引。要解指针引(即取所指区域值),C 的语  (*ptr)

Object Pascal 则是 ptr^

 

 

四、取地(指针值)。某对象地址并值给指针量,C 的语法是

 

ptr = &Object; Object Pascal 则是

 

ptr := @Object;

也只是符的差别已。

 

 

五、指针算。在 C 中,以对指进行移的运,如:

char a[20]; char *ptr=a; ptr++; ptr+=2;

 

 

- 11 -


 

Delphi

 

 

当执行 ptr++;译器产生让 ptr  sizeof(char)的代ptr 将指向 a[1]

ptr+=2;这句使得 ptr 前进两 sizeof(char)小的我们看一下 Object Pascal

中如何实

 

var

 

a : array [1..20] of Char;

ptr : PChar; //PChar 可以看作 ^Char begin

ptr := @a;

Inc(ptr); // 这句等  C  ptr++; Inc(ptr, 2); //这句价于  C ptr+=2;

 

end;

 

 

六、动态存分配。C 中,使用 malloc()库函内存free()函数释内存。这样的 代码:

 

int *ptr, *ptr2;

 

int i;

 

ptr = (int*) malloc(sizeof(int) * 20);

 

ptr2 = ptr;

 

for (i=0; i<20; i++){

 

*ptr = i;

 

ptr++;

 

}

 

free(ptr2);

Object Pascal 中,动态分内存函数是 GetMem(),与之对的释放数为 FreeMem()

(传统 Pascal 获取内的函 New() Dispose(),但 New()只能得对象单个实 体的内存小,无取得连的存放个对象块)。因,与上那段 C 码等 价的  Object Pascal 的代码为:

 

var ptr, ptr2 : ^integer;

 

i : integer;

 

begin

 

GetMem(ptr, sizeof(integer) * 20);

//这句等 C ptr = (int*) malloc(sizeof(int) * 20);

ptr2 := ptr; //保留原指针位置

 

for i := 0 to 19 do begin

ptr^ := i;

 

 

- 12 -


 

Delphi

 

 

Inc(ptr); end; FreeMem(ptr2);

end;

对于以上个例子无论是 C 版本,还是 Object Pascal 版本的),要注一个问题, 就是分配存的单是字BYTE),因此使用 GetMem 第二个数如想当然 的写成  20那么就出问题内存访越界)。 GetMem(ptr, 20);实际分配了 20 个字节的存空间一个整的大小四个字节那么访问五个之的所有素都是非 法的了( malloc()参数同)。

Delphi 针大全

 

 

 

 

 

3 谈谈  Delphi  的类型与指针

 

 

内存中的据除了  0 便是 1, 你把它作图片数字等等, 你的事, 存只认识

0  1.

 

 

Win32 系统除了使用硬内以外, 以从硬辟虚拟内存;

 

 

因为 Win32 的内存地址范围在  4  G 以内(0..232-1), 所以它最多能够给一个应用程序 分配  4G 的运行空间; 并且其中的  2G 有系统管, 实际上程序只有  2G 的自主空间. 记得有说  String 大长度是  2G ? 就是这道理.

 

 

   4G   ,      4G   ,      (1024*1024*1024*4  -  1  =

4294967295) 内存地址, 这刚好  Delphi  Cardinal 的最大值,  32 的指 类型追到都是  Cardinal 型的一数字.

 

 

一个内存址是  0..4294967295 之间的一个数字, 你可以通内存地读取或入数据; 一个指针要用索引或标内存, 它也是  0..4294967295 之间的一个数字; 它们虽不, 但通过指可以找实际存数据的存地址, 并按指定的类去读写它.

 

 

譬如:

 

 

 

var

 

str: string;

 

 

- 13 -


 

Delphi

 

 

n: Cardinal;

 

pstr: PString;

 

begin

 

str := 'ABCDE';

n := Cardinal(str); {获取内地址}

pstr := @str;            {现在 pstr  str 的指针}

 

 

{n pstr 数字结(果是随, 知道不一样就行了):} ShowMessage(IntToStr(n));                         {4571092} ShowMessage(IntToStr(Cardinal(pstr))); {1244652}

 

{但通过 pstr 找到  str} ShowMessage(pstr^); {ABCDE}

end;

 

 

 

 

程序行后, 所在基本是下个样(为单), 例中  n   :

 

A                B                C                D                E

 

 

换二进制示一下:

 

00001010                         00001011                         00001100                         00001101

 

00001110

 

 

, 是什; 么非  "ABCDE"

? 这可不一定.

 

 

下面的例, 我们是权且它当作符串, 着指针的, 字符也在变化.

 

 

然后, 有分别把它分别用  Byte 指针(PByte)  Integer 指针(PInteger) 去读取它, 也会得 到相应的值.

 

 

完整示例:

 

 

 

 

- 14 -


 

Delphi

 

 

unit Unit1;

interface uses

 

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

 

 

type

 

TForm1 = class(TForm) Button1: TButton; Button2: TButton; Button3: TButton;

procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject);

end;

 

 

 

var

 

Form1: TForm1;

 

 

 

implementation

 

 

 

{$R *.dfm}

 

 

 

procedure TForm1.Button1Click(Sender: TObject);

 

var

 

str: string; ps: PChar; n: Cardinal;

begin

 

str := 'ABCDE'; ps := PChar(str); n := Cardinal(ps);

//n := Cardinal(str); {行可以替上面}

ShowMessage(IntToStr(n)); {结果是 Windows 机管理的}

 

 

- 15 -


 

Delphi

 

 

 

 

ShowMessage(PChar(n));     {ABCDE} ShowMessage(PChar(n+1)); {BCDE} ShowMessage(PChar(n+2)); {CDE} ShowMessage(PChar(n+3)); {DE} ShowMessage(PChar(n+4)); {E}

end;

 

 

 

procedure TForm1.Button2Click(Sender: TObject);

 

var

 

str: string;

 

n: Cardinal;

 

pb: PByte;

 

begin

 

str := 'ABCDE';

 

n := Cardinal(str);

ShowMessage(IntToStr(n)); {4571140; 这是我这里的结果, 是随机}

 

 

 

pb := PByte(n); ShowMessage(IntToStr(pb^)); {65} pb := PByte(n+1); ShowMessage(IntToStr(pb^)); {66}

end;

 

 

 

procedure TForm1.Button3Click(Sender: TObject);

 

var

 

str: string;

 

n: Cardinal;

 

pint: PInteger;

 

begin

 

str := 'ABCDE';

 

n := Cardinal(str);

ShowMessage(IntToStr(n)); {4571140; 这是我这里的结果, 是随机}

 

 

pint := PInteger(n); ShowMessage(IntToStr(pint^)); {1145258561}

 

 

- 16 -


 

Delphi

 

 

pint := PInteger(n+1); ShowMessage(IntToStr(pint^)); {1162101570}

end;

 

 

 

end.

 

 

 

 

上面的第个程序的结果许让你:

第一个结果, 应该和 "ABCD" 有点系才对啊, : 1145258561 ?

第二个结果, 应该和 "BCDE" 有点系才对啊, : 1162101570 ?

 

 

为什么呢? 然没错, 我解释:

1145258561 转换成十六进制是: 44434241, 写得清楚一点是: $44 $43 $42 $41; 还记得

Intel 等当下流行的 CPU 数据是着的吗?

 

 

自己算算一个, 件中的算器即可.

 

 

 

 

 

 

 

 

 

 

 

 

4 Delphi 7 指针数据类型 指针类型 访问一个存变量常有两方法一种通过名访问另一种通过地访问指针是

通过地址访问变量一种数类型。

 

 

由于动态据结构变量必在程序行过程生成不能先声明以无法先给 这些变量好名字法通过字进行访只能用指先得到的地址间接 访问它们。

 

 

指针类型定义如

 

 

 

 

- 17 -


 

Delphi

 

 

type 指针类型标识^类型标识符;

 

 

可以对指变量赋值指针变赋值实上是将的指针变所指向动态存单元的首 地址赋给该指,使该指指向新的态存储单元。给指针赋值必类型相同 nil(空 值),给针赋值,指针来所指动态存中还存有据,只它已无被访问。

 

 

对指针可应用比运算符中的<>进行比较指针指同一个态变量, 则两个指变量相则即为Delphi 的指分为  "型指" "无类指针" .

Delphi 的类型, 用的也有几百个, 我们可以给每种类型义相应类型指针.

其实 Delphi 为很多型预定了指针, 据类型: Integer 有对应的  PInteger;

Char 有对应的  PChar; string 对应的  PString; 再譬如:

TPoint 有对应的  PPoint;

TColor 有对应的  PColor 等等.

 

 

另外, 指针可以有, 譬如: PChar 是字指针, PPChar 又是  PChar (

Delphi 定义).

 

 

 

 

 

 

总结一下型与指的命名:

类型约定用 T (Delphi 的数据型除外, : String);

指针约定用 P 打头;

指针的指约定用  PP 打头.

类型和指是不可的两个, 指针身也是一种类型  - "指针类".

 

 

先认识一指针相的操作(@^Addr):

@                @变量                取变量

Addr                Addr()

^                指针^                获取指针指的实际

var Pxxx: ^类型                  Pxxx 种类型的指针的变量

type Pxxx = ^类型                 定义  Pxxx 为某的指针

 

 

 

 

- 18 -


 

Delphi

 

 

:定义整型

 

 

 

var

 

a :^Integer;

 

b :^Integer;

 

 

也可以用:

 

 

 

var

 

a Integer;

 

b Integer;

 

 

Object Pascal 认为每一个针类是相异,为 a 的值赋给 b,你必建立一新的 类型,示如下:

 

type

 

Pin = ^integer;

 

var

 

a,b :pin;

也可以直

 

var

 

a,b :^integer;

 

 

 

 

 

 

 

 

 

5 delphi 中的 Pchar 指针

 

 

1  传统的 Pascal 字符串

 

 

Pascal 中,典的字符是一定度的字序列。每字符串一设定长度(缺 省值为 255),下面是个例子:

 

 

Var Address:String; Code:String[50];

 

 

- 19 -


 

Delphi

 

 

Address 是一长度为 255 的字符串Code 的最大度为 50

传统的 Pascal 字符长度不超过 255 可以用字串连接"+"符串接在一

 

Result:=String1+String2;

 

 

2  Delphi 的长字

 

 

Delphi 除了持传统的 Pascal 字符串长字符串长字符 ANSIString 字符串动分配内存即用字串时才配字需内存其长度受限制 Delphi 中你如果用 String1:String 作类型明,则 String1 既可能是字符串可能是字符串, 这取决于译器中$H 的设置默认值为$H+代表 ANSI 长字符串,VCL 中的组使 ANSI 长字符串长字符 null 结束这就说长字符串与 C 语言的以 null 字符串完兼容。

 

 

可以通过 SetLength 函数设置字串的最长度:

SetLength(String1,100); TrimLeft,TrimRight Trim 函数别来消字符串 首尾的空区。

 

 

如果 Delphi Exended Syntax 已经设置缺省值) 0 为起点字符数就和 指向字符指针 Pchar 完全兼,因为以 0 为起的字符数名即指该字符组首字符 的指针。以将字串直接值给 Pchar 指针

 

 

 

var

 

P: PChar;

 

begin

 

P := 'Hello world';

 

end;

这样 P 向存字符串'Hello world'并以 null 结束的一内存。

 

 

许多 Windows 的应程序 API 函数要求用 Pchar 类型作参数Pchar 针在使用  GetMem(var  P:  Pointer;  Size:  Integer) FreeMem(var P: Pointer[; Size: Integer])函数存。例如:

 

Var WinDir,SysDirchar; Begin

GetMem(WinDir,256);{为指针分内存}

GetWindowsDirectory(WinDir,128);{ Windows 装目录放至 WinDir}

 

 

- 20 -


 

Delphi

 

 

ShowMessage('Windows directory is'+WinDir);{结果}

 

End;

 

 

二:字符转换

 

 

以上绍了 Delphi 中的四字符串定义和使用。由于类函数字符串数类型要 求不一,就需要行字符类型转

 

 

1  可以用 StrPas 将以 null 的字符转换为 Pascal 短字符串。StrpCopy 则完成相反 的转换。

2  因为长字串以 null ,所以以用强转换将长符串转 Pchar 类型。 用法是:Pchar(s),s 个长字串。强类型转返回一个向长字串首字的指针, 并且所指符串以 null 束。例

 

Var Caption,Message:string; Caption:='Hello World!'; Mssage:='This is a test of long string';

MessageBox(0,Pchar(Message),Pchar(Caption),MB_OK);

 

 

小结在使用 Delphi 中的符串时要时刻楚该字符的类型以免引混淆。在 理解字符时要把符串与针,内分配联,加强理

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

- 21 -

 

原文地址:https://www.cnblogs.com/jxgxy/p/2083454.html