Delphi 指针 入门

        指针,是一个无符号整数(unsigned int),它是一个以当前系统寻址范围为取值范围的整数。指针对应着一个数据在内存中的地址,得到了指针就可以自由地修改该数据。指针的指针就是用来存放指针所在的内存地址的。

@:取址运算符;
^:指针的引用解析操作符;

1,类型指针的定义。对于指向特定类型的指针
var
ptr : ^Integer;
ptr : ^char;


2,无类型指针的定义。也就是可以指向任何类型数据的指针。Object Pascal为其定义了一个专门的类型:Pointer。
ptr : Pointer;

 

3,指针的解除引用。要解除指针引用(即取出指针所指区域的值), ptr^。

 

4,取地址(指针赋值)。取某对象的地址并将其赋值给指针变量,ptr := @Object;

 

看一个指针用法的例子:   

var     
  X, Y: Integer;    // X and Y    整数类型     
  P:    ^Integer;   // P 指向整数类型的指针     
begin     
  X := 17;   //给 X  赋值     
  P := @X;   //把 X 的地址赋给 p     
  Y := P^;   //取出p所指向的数值赋给 y     
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,表示指证什么也不指向。

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值