delphi指针

以下内容分为八部分,分别是

一、类型指针的定义

二、无类型指针的定义

三、指针的解除引用

四、取地址(指针赋值)

五、指针运算

六、动态内存分配

七、字符数组的运算

八、函数指针

一、类型指针的定义。

对于指向特定类型的指针,在C中是这样定义的:

[cpp] view plain

  1. int *ptr;
  2. char *ptr;

与之等价的Object Pascal是如何定义的呢?

[delphi] view plain

  1. var
  2. ptr : ^Integer;
  3. ptr : ^char;

其实也就是符号的差别而已。

二、无类型指针的定义。

C中有void *类型,也就是可以指向任何类型数据的指针。Object Pascal为其定义了一个专门的类型:Pointer。于是,

[delphi] view plain

  1. ptr : Pointer;

就与C中的

[cpp] view plain

  1. void *ptr;

等价了。

三、指针的解除引用。

要解除指针引用(即取出指针所指区域的值),C 的语法是 (*ptr),Object Pascal则是 ptr^。

四、取地址(指针赋值)。

取某对象的地址并将其赋值给指针变量,C 的语法是

[cpp] view plain

  1. ptr = &Object;

Object Pascal 则是

[delphi] view plain

  1. ptr := @Object;

也只是符号的差别而已。

五、指针运算。

在C中,可以对指针进行移动的运算,如:

[cpp] view plain

  1. char a[20];
  2. char *ptr=a;
  3. ptr++;
  4. ptr+=2;

当执行ptr++;时,编译器会产生让ptr前进sizeof(char)步长的代码,之后,ptr将指向a[1]。ptr+=2;这句使得ptr前进两个sizeof(char)大小的步长。同样,我们来看一下Object Pascal中如何实现:

[delphi] view plain

  1. var
  2. a : array [1..20] of Char;
  3. ptr : PChar; //PChar 可以看作 ^Char
  4. begin
  5. ptr := @a;
  6. Inc(ptr); // 这句等价于 C 的 ptr++;
  7. Inc(ptr, 2); //这句等价于 C 的 ptr+=2;
  8. end;

只是,Pascal中,只允许对有类型的指针进行这样的运算,对于无类型指针是不行的。

六、动态内存分配。

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

[cpp] view plain

  1. int *ptr, *ptr2;
  2. int i;
  3. ptr = (int*) malloc(sizeof(int) * 20);
  4. ptr2 = ptr;
  5. for (i=0; i<20; i++){
  6. *ptr = i;
  7. ptr++;
  8. }
  9. free(ptr2);

Object Pascal中,动态分配内存的函数是GetMem(),与之对应的释放函数为FreeMem()(传统Pascal中获取内存的函数是New()和 Dispose(),但New()只能获得对象的单个实体的内存大小,无法取得连续的存放多个对象的内存块)。因此,与上面那段C的代码等价的Object

Pascal的代码为:

[delphi] view plain

  1. var ptr, ptr2 : ^integer;
  2. i : integer;
  3. begin
  4. GetMem(ptr, sizeof(integer) * 20);
  5. //这句等价于C的 ptr = (int*) malloc(sizeof(int) * 20);
  6. ptr2 := ptr; //保留原始指针位置
  7. for i := 0 to 19 do
  8. begin
  9. ptr^ := i;
  10. Inc(ptr);
  11. end;
  12. FreeMem(ptr2);
  13. end;

对于以上这个例子(无论是C版本的,还是Object

Pascal版本的),都要注意一个问题,就是分配内存的单位是字节(BYTE),因此在使用GetMem时,其第二个参数如果想当然的写成 20,那么就会出问题了(内存访问越界)。因为GetMem(ptr, 20);实际只分配了20个字节的内存空间,而一个整形的大小是四个字节,那么访问第五个之后的所有元素都是非法的了(对于malloc()的参数同样)。

七、字符数组的运算。

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

[cpp] view plain

  1. char str[15];
  2. char *pstr;
  3. strcpy(str, "teststr");
  4. strcat(str, "_testok");
  5. pstr = (char*) malloc(sizeof(char) * 15);
  6. strcpy(pstr, str);
  7. printf(pstr);
  8. free(pstr);

而在Object

Pascal中,有了String类型,因此可以很方便的对字符串进行各种运算。但是,有时我们的Pascal代码需要与C的代码交互(比如:用Object Pascal的代码调用C写的DLL或者用Object Pascal写的DLL准备允许用C写客户端的代码)的话,就不能使用String类型了,而必须使用两种语言通用的字符数组。其实,Object Pascal提供了完全相似C的一整套字符数组的运算函数,以上那段代码的Object Pascal版本是这样的:

[delphi] view plain

  1. var str : array [1..15] of char;
  2. pstr : PChar; //Pchar 也就是 ^Char
  3. begin
  4. StrCopy(@str, ‘teststr‘); //在C中,数组的名称可以直接作为数组首地址指针来用
  5. //但Pascal不是这样的,因此 str前要加上取地址的运算符
  6. StrCat(@str, ‘_testok‘);
  7. GetMem(pstr, sizeof(char) * 15);
  8. StrCopy(pstr, @str);
  9. Write(pstr);
  10. FreeMem(pstr);
  11. end;

八、函数指针。

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

[cpp] view plain

  1. typedef int (*PVFN)(int); //定义函数指针类型
  2. int main()
  3. {
  4. HMODULE hModule = LoadLibrary("test.dll");
  5. PVFN pvfn = NULL;
  6. pvfn = (PVFN) GetProcAddress(hModule, "Function1");
  7. pvfn(2);
  8. FreeLibrary(hModule);
  9. }

就我个人感觉来说,C语言中定义函数指针类型的typedef代码的语法有些晦涩,而同样的代码在Object Pascal中却非常易懂:

[delphi] view plain

  1. type PVFN = Function (para : Integer) : Integer;
  2. var
  3. fn : PVFN;
  4. //也可以直接在此处定义,如:fn : function (para:Integer):Integer;
  5. hm : HMODULE;
  6. begin
  7. hm := LoadLibrary(‘test.dll‘);
  8. fn := GetProcAddress(hm, ‘Function1‘);
  9. fn(2);
  10. FreeLibrary(hm);
  11. end;
时间: 2024-08-02 14:21:47

delphi指针的相关文章

DELPHI指针的使用

DELPHI指针的使用 大家都认为,C语言之所以强大,以及其自由性,很大部分体现在其灵活的指针运用上.因此,说指针是C语言的灵魂,一点都不为过.同时,这种说法也让很多人产生误解,似乎只有C语言的指针才能算指针.Basic不支持指针,在此不论.其实,Pascal语言本身也是支持指针的.从最初的Pascal发展至今的Object Pascal,可以说在指针运用上,丝毫不会逊色于C语言的指针. 以下内容分为八部分,分别是 一.类型指针的定义 二.无类型指针的定义 三.指针的解除引用 四.取地址(指针赋

delphi.指针.PChar

此文是delphi.指针.应用姊妹篇,想细化一下PChar应用,所以有了此文. 注意: 1:此文讲的是PChar与字符串相关操作,其它方法暂不多讲. 2:由于D分开Ansi/Unicode的两种完全不同的编绎器,即: Ansi.Char=AnsiChar; Unicode.Char=WideChar 所以在此文中,PChar针对于PAnsiChar, 对于PWideChar,需要做其它处理,请注意 PChar是一个指针,它指向了一个字符串内容的指针,与Pointer相比,它有数据类型(Char)

delphi指针简单入门

delphi指针简单入门:         看一个指针用法的例子:     1         var     2             X,   Y:   Integer;       //   X   and   Y   整数类型     3             P:   ^Integer;           //   P   指向整数类型的指针     4         begin     5             X   :=17; //   给   X   赋值     6

Delphi 指针大全(光看不练是学不会的)

大家都认为,C语言之所以强大,以及其自由性,很大部分体现在其灵活的指针运用上.因此,说指针是C语言的灵魂,一点都不为过.同时,这种说法也让很多人产生误解,似乎只有C语言的指针才能算指针.Basic不支持指针,在此不论.其实,Pascal语言本身也是支持指针的.从最初的Pascal发展至今的Object Pascal,可以说在指针运用上,丝毫不会逊色于C语言的指针. 以下内容分为八部分,分别是    一.类型指针的定义    二.无类型指针的定义    三.指针的解除引用    四.取地址(指针赋

Delphi 指针大全

- 1 -目 录1 DELPHI 的指针-引用.................................................................................- 1 -2 delphi 的"引用/值"模型..............................................................................- 5 -3 谈谈 Delphi 的类型与指针.................

delphi 指针 认识

delphi 指针分为类型指针和无类型指针: 类型指针分为PChar.PInteger.PString等. 无类型指针Pointer. PPChar/PP...为指针的指针 @和Addr一样,为获取变量存放的地址.^为指针指向的内容. @变量, Addr(变量), 指针^ var p: pChar; // 这样定义 p为类型指针:PChar() PInteger() PString()... PChar 可看做 ^Char begin p := 'China'; inc(p); p := p +

Delphi指针详解

Delphi指针详解2007-12-04 06:08:57|  分类: DLL学习 阅读91 评论0   字号:大中小 订阅 大家都认为,C语言之所以强大,以及其自由性,很大部分体现在其灵活的指针运用上.因此,说指针是C语言的灵魂,一点都不为过.同时,这种说法也让很多人产生误解,似乎只有C语言的指针才能算指针.Basic不支持指针,在此不论.其实,Pascal语言本身也是支持指针的.从最初的Pascal发展至今的Object Pascal,可以说在指针运用上,丝毫不会逊色于C语言的指针. 以下内

Delphi指针运用理解

现在是面向对象漫天飞的年代了,大家都在在谈面向对象编程.Java对指针“避而不谈”,C#虽然支持指针运用,但是也淡化处理. 然而,指针还是好完全掌握为妙,省得在开发过程碰钉子,至于对指针的运用在于开发人员的存乎于心,运用得当.指针运用的不好,不要怪开发语言及其机制.下面谈到的是在Delphi中指针的运用,至于其他语言,指针的思想是相通的. 指针是一种数据类型,和编程语言中其它的类型一样,是一种类型的区分,比如 Integer 是带符号的整型,在32位X86机中,是用4个字节表示,而指针也是用4个

delphi.指针.应用

注:初稿...有点乱,可能增删改... 因为指针应用,感觉不好写,请大家指出错误,谢谢. 注意: 本文着重点讲的是指针的各类型的应用或使用,而不是说这种方法不应该+不安全+危险+不提倡使用. 其它:本文说的是x86环境,x64会有变化,且,只是讲述一些方法,细节部分,如果涉及到不同平台问题,勿太深究.:) 指针:按正规解释是:“指向另一内存块地址的变量”,它是一个变量值,只有4字节(x86=>sizeof(Pointer)=4, x64=8,以下都以x86为准). 所以,它与内存其实息息相关,所