zoukankan      html  css  js  c++  java
  • Delphi指针及其它(转)

    一、指针:指向一个内存地址的变量或参数。
      
      二、定义指针的方式如下:
      
       P: Pointer; //定义了可以指向任何类型的指针,Pointer 为无类型指针;
       Q, R: ^TType; //定义了指向 TType 类型的两个指针,TType 可是是各种
       //基本类型或自己定义的各种类型,也可以如下定义:
       // type PType = ^TType;
       // var Q, R: PType;
      
      三、指针的使用:
       P: Pointer;
       Q, R: ^TType;
       A: TType;
      
       Q:= R; //相同类型可以赋值
       P:= R; //可以把任何类型指针赋给无类型指针
       R:= P; //可以把无类型指针赋给有类型的指针
       Q:= @A; //加 @ 后,得到指向 A 的无类型指针,然后赋给 Q
       New(Q); //分配一个 TType 类型的空间,并把地址赋给 Q
       Dispose(Q); //释放 Q 所指向的空间
      
      四、指针的强制转换
       type TType = record ... end;
       PType = ^record ... end;
       var P: ^Integer;
       A: TType;
      
       P:= @A; //加 @ 后,得到指向 A 的无类型指针,可以赋给 P
       PType(P).xxx //把 P 转换为 PType 类型,并引用记录中的值
       with PType(P)^ do begin ... end; // 注意 ^ 的使用,在上一行中,
       //不需要加 ^ (当然加也不错),编译器可以自动识别,
       //而在这一行中,如不加 ^ ,会引起混淆。
      
       例子(把 string 的一个汉字当作 WideChar 并赋给一个整型变量):
       A: Integer; S: string;
       A:= Word(PWideChar(@S[3])^);
       // @S[3] 得到 S[3] 的地址,然后把它当作指向 WideChar 的指针,
       // 用 ^ 取出一个汉字,再用 Word 强制转换,最后赋给一个整型变量。
       // 用 Word 转换的原因是 Word 的字节数和 WideChar 的字节数一样。
       // 在 Delphi 中,只要字节数一样的类型,都可以用强制转换,如字节
       // 不一样,就要用函数,这也是很合情理的。
       // 一定要这么写是让程序员知道自己在干什么,不至于出错,真正的实现
       // 是很简单的。
      
      五、函数类型
      
       函数类型也是指针,定义函数类型如下:
       type TFunc = function (X: Integer; S: string): Boolean;
       TProc = procedure;
       var F, G: function(A: Integer): string;
       function Test(B: Integer): string;
       使用:
       F:= nil; //函数类型是指针
       F:= Test; //当函数类型在赋值号左面,右面是一个函数时当作是对函数
       //类型赋值,其它情况(如右面不是一个函数或函数类型在左
       //面或不是赋值号等),则认为是调用指向的函数,如下面一行
       S:= F(3); // 直接调用函数 Test(3);
       F:= @Test; // 取 Test 函数的地址并赋给 F,所以这样也正确
       @F:= @Test; //对函数类型取地址,得到的是所指向函数的地址,所以这样也正确
       @@F ... // 若想取函数类型的地址用两个 @,即 @@
       @F = @Test; // 判断 F 是否指向 Test,通过比较两个无类型指针得到
       Assigned(F) // 因为 F = nil 中左侧是调用 F,为了判断 F 是否不为空,
       // 用 Assigned
      
      六、方法指针
      
       这里指的是类内的函数类型,是一对指针,一个指向函数地址,另一个存放
      实例的引用。
       定义如下:
       TMethod = procedure (...) of object;
       使用:
       type TTest = class procedure T(...); end;
       var M: TMethod;
       M:= TTest.T;
       因为这里是一对指针,与其他指针的转换就有些问题,这里就不说了。
      
      七、集合、数组、动态数组、记录等
      
       这些是特定的类型,Delphi 没有说他们是指针类型,这和 C 是有区别的
      (随便什么都可以当指针用)。这一点请特别注意。
      
       要想使他们和指针取得联系,一般要使用地址符 @,其实这也是很方便的,
      如上面的汉字例子。还有前面讨论的 BlockRead 等例子都是这样。
      
       S: array of record ... end;
      
       SetLength(S, N);
       BlockRead(F, S[0], N);
       ~~~ 这里没有 @ 符的原因是它是 var 参数,不加 @ 就会把
       S[0] 的地址传进去。

  • 相关阅读:
    web.xml配置详解
    javascript实现的网页打印
    C#实现新建文件并写入内容
    nodeJs学习过程之认识nodejs
    windows下nodejs与coffeeScript环境搭建
    javascript/css压缩工具---yuicompressor使用方法
    verilog描述表决器的两种方式简易分析
    verilog阻塞与非阻塞的初步理解(二)
    verilog阻塞与非阻塞的初步理解(一)
    FIFO学习心得
  • 原文地址:https://www.cnblogs.com/China3S/p/3237409.html
Copyright © 2011-2022 走看看