zoukankan      html  css  js  c++  java
  • 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有相同的值.   
        
      操作符@用来取出变量的地址,也可以取出过程和函数的地址.   
        
      而符号^有两个目标,   
      当它出现在类型定义的前面时如 ^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.当@用在类的方法中时,则方法的名称必须有类名,例如@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;                           //   调用函数   
        
      第一句获得函数的入口,第二句将指针复制,第三句获得函数的返回值。   
        
      有时候还可以这样使用   
      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);   
        
        
      先到这里吧,我也是一边看帮助一边翻译的,没有参考什么书籍,所以有一些名词可能不太准确,希望大家多多包涵吧,毕竟本人的英文水平有限啊   
        
      .呵呵   
        
      有什么问题可以参看delphi的帮助的相关内容,个人觉得还是看帮助好一些,而且原文最好,像我这样翻译可能误导大家啊,看的时候要受其精华   
        
      弃其糟粕,看完了别骂我就行了,全当我给大家仍块砖头吧,别砸我啊@_@

    http://blog.csdn.net/diligentcatrich/article/details/5492963

    好的代码像粥一样,都是用时间熬出来的
  • 相关阅读:
    学习笔记-Java设计模式-结构型模式1
    学习笔记-Java设计原则
    阅读笔记:DQL、DML、DDL、DCL的概念与区别
    阅读笔记-HTTP返回状态码
    大数据应用技术课程实践--选题与实践方案
    15 手写数字识别-小数据集
    14 深度学习-卷积
    java集合(一)
    13-垃圾邮件分类2
    机器学习——12.朴素贝叶斯-垃圾邮件分类
  • 原文地址:https://www.cnblogs.com/jijm123/p/14332069.html
Copyright © 2011-2022 走看看