• 指针


    指针:
      一个指针变量指示了内存的位置,在本章介绍 Pchar 类型时,就有使用指针的例子, Pascal 通用
    指针类型的名称是 Pointer 。 Pointer 有时又被称为无类型指针,因为它只指向内存地址,但编译器并
    不管指针所指向的数据,这一点与 Pascal 严谨的风格似乎不相称,所以建议你在大部分情况下用有类型
    的指针。注意指针是一种高级技术,对于编写程序来说不是必须的,当你对它运用熟练以后,它会成为你
    写程序的好工具。

      有类型指针在你的应用程序的 Type 部分用 ^ (或 Pointer)运算符声明。对于有类型指针来说,编译
    器能准确地跟踪指针所指内容的数据类型,这样用指针变量,编译器就能跟踪正在进行的工作。以下是声
    明指针的例子。

    Type
      PInt = ^Integer; // PInt现在是指向 Integer 的指针
     
      Foo = record // 一个记录类型
        GobbledyGook: string;
        Snarf : Real;
      end;
      PFoo = ^Foo; // PFoo是一个指向 Foo 类型的指针

      var
        P: Pointer; // 一个无类型的指针
        P2: PFoo; // PFoo的实例
       
        注意C语言的程序员可能注意到了, Object Pascal 的 ^ 运算符与C语言中 * 运算符相似,
    Pascal 的 Pointer 类型对应与 C 的 void * 类型。要记住一个指针变量仅仅是存储一个内存的地址,
    为指针所指向的内容分配空间是程序员要干的工作,用在前面介绍过的并列在表2 - 6中的内存分配例
    程来分配内存。注意如果一个指针没有指向任何数据,它的值是 nil ,它就被称为是零(nil)指针或
    空(null) 指针。要访问一个指针所指向的内容,在指针变量名字的后面跟上^运算符。这种方法称为对
    指针取内容 //@为取址运算符

    什么时候用 New():
      用 New() 函数能为一个指针分配指定长度的内存空间。在为某结构分配内存时,因为编译器知道要
    分配的内存的大小,所以调用 New() 就能分配到所需的字节,而且它比 GetMem() 或AllocMem()更安全,
    更易于使用。但不能用 New() 为 Pointer 或 Pchar 变量分配内存,因为编译器不知道需要分配多大的
    内存。另外要记住用 Dispose() 函数来释放用 New() 分配的内存。当编译器不知道要分配多少内存时,
    就要用到 GetMem() 和 AllocMem() ,在对 Pchar 和Pointer 类型分配内存时,编译器不可能提前告诉
    你要分配多少,因为它们有长度可变特性。要注意,不要试图操作分配空间以外的数据,因为这是导致
    "Access Violation" 错误最常见的原因。用 FreeMem() 来释放由 GetMem() 和 AllocMem() 分配的内存。
    顺便说一下,AllocMem() 要比GetMem()安全,因为 AllocMem() 总是把分配给它的内存初始化为零。

      C程序员在学习 Object Pascal 时感到头痛的是, Object Pascal 对指针类型的检查非常严格,
    例如,下面的代码中变量a和变量b并不兼容:

    var
      a:^Integer;
      b:^Integer;

    相反在C语言中是兼容的:
     int *a;
     int *b;

    为了让其在PASCAL中兼容,要如下生名:
    type
       Ptrinteger = ^Integer;
     var
       a,b:PtrInteger; //现在a和b相兼容了
      
      
      
      

    出处: delphi 5开发人员指南 第2章

    *****************************************************************
    补充:
    ReallocMem 函数说明                              }
          使用 ReallocMem 重新分配内存后,如果新空间变大, 
        原有的数据会被复制过来,如果新空间变小,空间中的  
        内容是原来靠前一部分的内容。                      
        重新分配数据后,空间变大,会占用跟多内存,变小,  
        原有多余出的空间并不会得到释放,也就是被泄露的空  
        间,如果新空间的大小变为 0 ,那么分配的空间被释放。
        此时可以用 Assigned 函数来进行检测。    
       
          针对同一个指针变量 P, 如果使用了FreeMem 函数对其
        进行释放操作后,再使用ReallocMem分配空间时会报错。
        应该使用AllocMem再次对其进行空间分配。
       
    自定义类型指针使用说明

    type
      PIntArray = ^TIntArray;
      TIntArray = array[0..1] of Integer;

    var
      P: PIntArray;
     
      此时P是一个指针类型变量,正确的强转操作如下:
      PIntArray(P) 或 TIntArray(P^)
      对其中数据元素正确的操作方法如下:
      PIntArray(P)^[i] 或 TIntArray(P^)[i]
     
      说明:强转操作与其操作数的类型应该一致。
            PIntArray的操作数应该是指针P
            TIntArray的操作数应该是指针内容P^
     
      注意:由于定义数组的类型的索引范围是0..1
            所以强转后的操作范围也是0..1,就是说
            最大操作数是PIntArray(P)^[1]。当输入2
            是编译不过去,当然可以使用变量代替,但是
            不保证其安全性。     

  • 相关阅读:
    opencv imdecode和imencode用法
    caffe网络中屏蔽某一层的输出Silence层
    Opencv画图操作
    linux读取Windows的txt文件问题
    yolo检测系列
    c提取文件路径、文件名和后缀名
    draknet网络配置参数
    darknet源码解析
    Web_Toy
    Heart thing
  • 原文地址:https://www.cnblogs.com/spiritofcloud/p/3898358.html
Copyright © 2020-2023  润新知