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] 的地址传进去。

  • 相关阅读:
    Springboot 之 自定义配置文件及读取配置文件
    SQLSERVER系统视图 sql server系统表详细说明
    MySQL Workbench建表时 PK NN UQ BIN UN ZF AI 的含义
    使用Ecplise git commit时出现"There are no stages files"
    maven添加sqlserver的jdbc驱动包
    java将XML文档转换成json格式数据
    java将XML文档转换成json格式数据
    cannot be resolved. It is indirectly referenced from required .class files
    org.codehaus.jackson.map.JsonMappingException: Can not construct instance of java.util.Date from String value '2012-12-12 12:01:01': not a valid representation (error: Can not parse date "2012-12-
    @Autowired注解和静态方法 NoClassDefFoundError could not initialize class 静态类
  • 原文地址:https://www.cnblogs.com/China3S/p/3237409.html
Copyright © 2011-2022 走看看