DELPHI 指针使用用的一篇好文 收藏
    Delphi里自己管理内存的两对函数 new(),dispose()和getmem(),freemem()

大家都认为,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),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;  
                    只是,Pascal中,只允许对有类型的指针进行这样的运算,对于无类型指针是不行的。  
   
            六、动态内存分配。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;  
                                    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");  
                    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;  
                    var  
                            fn     :     PVFN;    
                                    //也可以直接在此处定义,如:fn     :     function     (para:Integer):Integer;  
                            hm     :     HMODULE;  
                    begin  
                            hm     :=     LoadLibrary('test.dll');  
                            fn     :=     GetProcAddress(hm,     'Function1');  
                            fn(2);  
                            FreeLibrary(hm);  
                    end;

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/aroc_lo/archive/2010/04/07/5456930.aspx

DELPHI 指针使用用的一篇好文 收藏相关推荐

  1. c语言获取指针分配的字节数,c语言指针知识点总结(共6篇).docx

    c语言指针知识点总结(共6篇) C语言指针教学中的知识点分析与总结 摘要:分析指针的基本概念及指针在数组.函数.字符串.动态存储分配等方面的应用,提出指针教学过程中易混淆概念及注意事项,对初学者深入理 ...

  2. R语言dataframe(data.table)使用用最近的前一个非NA值向前填充缺失值NA实战

    R语言dataframe(data.table)使用用最近的前一个非NA值向前填充缺失值NA实战 目录 R语言dataframe(data.tabl

  3. Delphi指针大全

    Delphi指针理解 看一个指针用法的例子:      1          var      2              X,    Y:    Integer;        //    X   ...

  4. delphi指针简单入门

    delphi指针简单入门:         看一个指针用法的例子:     1         var     2             X,   Y:   Integer;       //   ...

  5. wind金融数据接口python_python使用用Wind接口获取全部A股历史交易数据

    python使用用Wind接口获取全部A股历史交易数据 2018-11-29 果然是中文编码的问题.搞定了,新鲜出炉一个小脚本.谢谢各位大神的解答. """ @Autho ...

  6. UML建模-如何使用用例获取需求

    简介: 开发都通常都使用典型场景(scenarios)来理解一个系统的需要是什么和系统是怎样工作的.不幸的是,尽管开发都已经这样做了,但它极少用有效的形式归档.用例(Use Cases)就是将这些场景 ...

  7. C/C++指针详解之提高篇

    目录 一. 堆空间与指针的相爱相杀 1.1 堆上一维空间 1.1.1 返回值返回(一级指针) 1.1.2 参数返回(二级指针) 1.2 堆上二维空间 1.2.1 指针作返值输出 1.2.2 空间申请与 ...

  8. [转]李维《Delphi 2006 高效数据程序设计——dbExpress 篇》连载

    ====================================================== 注:本文源代码点此下载 ================================= ...

  9. 只服这篇“神文”:基于老子哲学、相对论的超级人工智能模型

    作者 | Anonymous authors 译者 | TroyChang 出品 | AI科技大本营(ID:rgznai100) 在此前我们为大家介绍 ICLR 2020 论文投稿情况时,提到了一篇& ...

最新文章

  1. antd 表单提交,文件和表单内容一起提交,表单校验
  2. EXT.JS的PROXY放在哪里,STORE放在哪里,绝对是个技术活儿啊。
  3. 【SICP练习】110 练习3.23
  4. golang变量作用域
  5. Data Structure Problem
  6. CSS height高度 和 width宽度
  7. 【Day04】介绍防抖节流原理、区别以及应用,并用 JavaScript 进行实现
  8. 基于JAVA+SpringMVC+Mybatis+MYSQL的商场人员管理系统
  9. python运行脚本被杀死_Python脚本被杀死
  10. 机器学习基础(九)—— iterative optimization
  11. Centos7下部署ceph 12.2.1 (luminous)集群及RBD使用
  12. Vue学习笔记进阶篇——多元素及多组件过渡
  13. paip.python错误解决4
  14. nicescroll参数
  15. Python 实验三 使用 TCP 实现智能聊天机器人
  16. DevExpress 主从表折叠显示
  17. 如何快速掌握一门技术
  18. zk集群和clickhouse集群搭建
  19. Java通过openOffice实现word,excel,ppt转成pdf实现在线预览
  20. matlab Logistic回归模型

热门文章

  1. 走进移动web开发的四大框架
  2. virtual server2005下创建citrix集群的一点记录
  3. FW : 一只小青蛙的一生(图片连载)
  4. nyoj 287(区间覆盖)
  5. SQLserver2008数据表的修改操作
  6. 二进制包方式安装部署三节点k8s
  7. ant design pro总是跨域,proxy也没设置错误,原来是浏览器缓存,清理Chrome缓存就可以了...
  8. 压力测试工具Jemeter安装及使用
  9. CriminalIntent项目的强大完善
  10. oracle 清理跟踪文件.trc .trm