delphi和c指针与内存操作指南_指针与内存管理

其他范文 时间:2020-02-27 20:10:42 收藏本文下载本文
【www.daodoc.com - 其他范文】

delphi和c指针与内存操作指南由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“指针与内存管理”。

delphi和c指针与内存操作指南

1.动态变量

对于动态分内存的变量,使用System单元的下面两个函数: procedure New(var P: Pointer);//为变更分配内存 procedure Dispose(var P: Pointer);//释放内存 其中P为变量地址 示例: type Str18 = string[18];var P: ^Str18;begin New(P);P^ := 'Now you see it...';Dispose(P);{ Now you don't...} end;///////////////////////////// Delphi里自己管理内存的两对函数 new(),dispose()和getmem(),freemem()

delphi的指针

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

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

一、类型指针的定义

二、无类型指针的定义

三、指针的解除引用

四、取地址(指针赋值)

五、指针运算

六、动态内存分配

七、字符数组的运算

八、函数指针

一、类型指针的定义。对于指向特定类型的指针,在C中是这样定义的: int *ptr;char *ptr;与之等价的Object Pascal是如何定义的呢? var ptr : ^Integer;ptr : ^char;其实也就是符号的差别而已。

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

三、指针的解除引用。要解除指针引用(即取出指针所指区域的值),C的语法是(*ptr),ObjectPascal则是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;只是,Pascal中,只允许对有类型的指针进行这样的运算,对于无类型指针是不行的。

六、动态内存分配。C中,使用malloc()库函数分配内存,free()函数释放内存。如这样的代码: int *ptr, *ptr2;int i;ptr=(int*)malloc(sizeof(int)* 20);ptr2 = ptr;for(i=0;i

七、字符数组的运算。C语言中,是没有字符串类型的,因此,字符串都是用字符数组来实现,于是也有一套str打头的库函数以进行字符数组的运算,如以下代码: char str[15];char *pstr;strcpy(str “teststr”);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或者用ObjectPascal写的DLL准备允许用C写客户端的代码)的话,就不能使用String类型了,而必须使用两种语言通用的字符数组。其实,Object Pascal提供了完全相似C的一整套字符数组的运算函数,以上那段代码的Object Pascal版本是这样的: var str : array [1..15] ofchar;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)GetProcAddre(hModule, “Function1”);pvfn(2);FreeLibrary(hModule);} 就我个人感觉来说,C语言中定义函数指针类型的typedef代码的语法有些晦涩,而同样的代码在ObjectPascal中却非常易懂:

type PVFN =Function(para: Integer): Integer;var fn : PVFN;//也可以直接在此处定义,如:fn: function(para:Integer):Integer;hm: HMODULE;begin hm:= LoadLibrary('test.dll');fn:= GetProcAddre(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中的解决方案没什么两样.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有相同的值.操作符@用来取出变量的地址,也可以取出过程和函数的地址.而符号^有两个目标, 当它出现在类型定义的前面时如 ^typename 表示指向这种类型的指针;当它出现在指针变量后边时 如 point^ 返回指针指向的变量的值;

理解指针比较容易理解面向对象的pascal语言,因为指针经常在幕后操作.任何要求动态分配大的内存空间的类型可以用指针类型.例如 ,long-string变量,实际在使用指针进行操作.另外一些高级的编程技术需要使用指针类型.有时指针是适应object pascal严格的类型限制的唯一方法.同过一个通用的指针类型,通过类型转换成不同的指针类型,如下面的例子: type

PInteger = ^Integer;var R: Single;I: Integer;P: Pointer;//通用的指针 PI: PInteger;begin P := @R;//取出R的内存地址

PI := PInteger(P);//把通用类型转换成指向整数类型的指针 I := PI^;end;

当然了,实数和整数的存储格式不同.这种赋值是把原始的二进制数据从R拷贝到I,而不进行转换.保留字nil是一个特殊的常量可以赋给任何指针类型,当nil赋給一个指针时,指针什么也不指向,是一个空指针.@操作符返回变量的内存中的存储地址,或者是过程函数方法;1.如果变量,@X返回的是x的地址。如果编译选项{$T-}没有打开,着返回的事一个通用的指针,如果编译选项打开了,着返回的是x的类型对应的指

针.2.如果是例程(过程函数),@F返回的是F的入口点,@F的类型是一个指针。

3.当@用在类的方法中时,则方法的名称必须有类名,例如@TMycla.Dosomething 指针指向TMycla的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;// 调用函数

第一句获得函数的入口,第二句将指针复制,第三句获得函数的返回值。

有时候还可以这样使用

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 := GetProcAddre(KernelHandle, 'lstrcmpi');调用GetProcAddres函数,用strcomp指向这个值

任何过程变量可以赋成nil,表示指证什么也不指向。但是试图调用一个nil值的过程变量导致一个错误,为了测试一个过程变量是否可以赋值,用标准的赋值函数Aigned if Aigned(OnClick)then OnClick(X);

////////////////////////////// procedure Move(const Source;var Dest;Count: Integer);

procedure CopyMemory(Destination:Pointer;Source:Pointer;Length:Cardinal);

C语言数据结构与指针(4)

数据结构【第四次】实验报告学院:班级:学号:姓名:实验四(一)实验名称:C语言数据结构与指针(二)实验目的:巩固复习前期所学C语言的函数参数传递、指针和结构体等知识点,加强学习数据结构......

《指针》C语言实验报告

《指针》C语言实验报告C语言实验报告《指针》学号:__________ 姓名:__________ 班级:__________ 日期:__________指导教师:__________ 成绩:__________实验五 指针一、实验目的1、......

C语言指针实习

实习七:指针实习一、实习目的姓名:尹思智学号:2012014413完成日期:2013年4月1.由键盘输入10个整数,将它们从小到大排序 2.将10个字符串(设其长度小于30)排序。3.找出二维数组(设4行5......

c指针笔试题

c指针笔试题(锦集9篇)由网友“c429871160”投稿提供,下面就是小编给大家带来的c指针笔试题,希望大家喜欢,可以帮助到有需要的朋友!篇1:c指针笔试题 1. 变量的指针,其含义是指该变量......

C语言实验报告《指针》

学号:__________ 姓名:__________ 班级:__________ 日期:__________ 指导教师:__________ 成绩:__________实验五 指针一、实验目的1、掌握指针的概念、会定义和使用指针变量2、掌......

下载delphi和c指针与内存操作指南word格式文档
下载delphi和c指针与内存操作指南.doc
将本文档下载到自己电脑,方便修改和收藏。
点此处下载文档

文档为doc格式

热门文章
点击下载本文