指针与指针变量是两个不同的概念1.指针本身只不过就是一个地址、一个内存块,它里面可以存任意的值,一个指针的值可以是任何内容,可以是一个基本类型的变量的值,也可以是自定义类型的变量的值,当然也可以是一个指针类型的变量的值,它说明这个地址、内存块里存的是什么东西一个指针变量就是一个变量,不过这个变量的值是一个地址不知道理解是否正确请点评,谢谢!2.还有就是一个指针变量有什么用,一般什么时候用,有什么好处?请指教,谢谢!

解决方案 »

  1.   

    var p:Pointer;
    声明p是一个指针变量。p 是一个指针。。
    :)
      

  2.   

    我认为指针只是一个抽象的概念,是指指向内存某一字节的意思。指针实质是什么,究竟是什么样的数据类型,我也很想知道(VCL源码也看不出)。我倾向于指针是个记录类型,最少有两个元素。其中一个元素是地址,一个元素代表指针类型。而地址是一个具体的概念,是一个长度为32位的integer类型的变量。指针不能加减,而地址可以加减。integer(指针)就是地址。不知这样理解对不对?
      

  3.   

    fj218(fj218)你的看法有问题,指针就是一个整型变量。的确,指针变量是和所指向的内容信息相关联,这种关联是语言提供的,属于语言实现的部分,和语言对程序员提供的接口(所有的数据结构和控制结构),是两个层面的东西。不单单是指针,所有的变量在语言实现中都是内存块,都需要管理它的类型信息,这个不是说通过记录类型来实现的。
    我认为在讨论这个问题的时候要想清楚,是要讨论指针类型在语言中的意义,还是指针类型是如何实现的。
      

  4.   

    TO:asj()
    也许"指针是个记录类型"这种说法不妥,我也认为这是属于语言实现的部分,但究竟是怎样实现的,不会是无中生有吧。总而言之,一切都离不开Byte。但我可以肯定指针决不会就是一个整型变量。整形变量只是地址而已,而指针是指向这个地址的一种描述。
      

  5.   

    to fj218(fj218) 
    请看看编译原理相关的书吧,因为我也不是了解的很清楚,不能给你仔细的解释。但是可以肯定的说你的看法有问题。其实在实现阶段,就是一个整型也不是你想的那么简单,一样也要保存有类型信息的。但是这个和编程时候的数据类型根本不是一个层次的问题。
      

  6.   

    用指针有什么好处呢?
      在很多过程式语言中只能通过指针实现某些数据结构。指针可以在堆中分配空间。而基本数据类型都是在栈中分配的。什么时候用呢?
      如果你是用C/C++估计你不会问这个问题了,因为只要编程基本上必然会用到。如果你用delphi,基本上不需要用。用指针变量有什么好处呢?
    什么时候用呢?
      你的指针和指针变量是什么意思呢?在我看来没有指针变量概念,任何变量都是可以通过指针指向的。
      

  7.   

    asj() 十分感谢你的帮助delphi的longstring类型的变量不就是一个指针吗?
    一个类类型的变量(对象)不也是一个指针吗?我看过c的指针变量是说是指针类型的变量,指针变量的引用是指
    1.把一个变量的地址赋给一个指针变量
    2.把一个变量的值赋给一个指针变量
      

  8.   

    你大概是指指向指针的指针吧。任何变量都可以用一个指针指向它,那么当然一个指针本身也可以用一个指针指向了。
    Type
      pInt = ^Integer;
      ppInt = ^pInt;
    var
      i: Integer;
      p: pInt;
      pp: ppInt;
    begin
      i := 2;
      p := @i;
      pp := @p;
    end;
      

  9.   

    只要你在编程,你实际上就在使用指针,
    比如:
    var
      i: Integer;
    这里i是变量,i在内存里肯定有一个存放的地方(内存地址,指针是也),
    只不过编译器给我们做好了而已!!!
      

  10.   

    指针代表地址 应该存在于程序的 代码段 (把内存分成数据段和代码段)
    指针变量是一个数据 存在于数据断,内容表示一个地址,它本身也有一个内存地址.如果内存理解为房间 地址就是门牌. 程序的代码段理解为管理员, 管理员有时关心房间里住的人(用变量来操作),有时只喜欢根据门牌号(指针)来处理问题,比如:今天晚上512的人全都搬到123去. bonniewater帮我倒杯水,(bonniewater住哪屋了就不管了)
      

  11.   

    fj218(fj218) :不是我想跟你过不去,而是我真的好怀疑你的能力!自己先好好学!你在看看:
    http://expert.csdn.net/Expert/topic/2502/2502986.xml?temp=.8532526
    你的回答真能让人笑话你没做过项目!
      

  12.   

    如果指针是整型变量的话,那么请问该如何解释integer(指针)的含义,而唯一可以解释的就是编译器强制性把指针类型转换为整型变量,所以说指针决不是整型变量,否则编译器吃多了还要在指针前加个额外的integer。
      

  13.   


    如Integer就是变量。如果定义了PInteger = ^Integer,那么PInteger就成了指针了。
      

  14.   

    指针就是指针变量。
    指针是指针变量的简称。
    在32位系统下一个指针占用4个字节,与integer变量恰好相等。
    其实根本原因是,因为通用寄存器是32位的。
      

  15.   

    变量的值最终要放到内存里的。对系统内存的管理,不同操作系统是有差别的,以前dos只能处理1M的内存。现在奔腾系列好像是能管理4G内存,这个取决于cpu的地址线的数目。 物理内存的地址,我们的程序里是看不到的,当然想查出来应该有办法,只是我没有想过。    操作系统为每个程序划分地址空间,那么我们编的程序里的所有地址使用一个相对地址,也就是说程序里的0地址起点是所使用地址空间的起点,不是内存条上的起点。另外地址的编排是以字节为单位的,子长64的word变量占用8个地址。
        
        指针所存的地址是变量的入口,就是开始的那个字节的地址。也是一个相对地址,使用地址操作一个64位的word就一次读出8个字节,其他的一样,所以指针有个类型问题,这个类型是怎么实现的我也没有追究过,应该是编译器控制的。如果使用一个可变长的字符串指针,不断的加,那么就可能出现地址越界,就是超过所划定的地址空间,这就是著名的溢出。 好多地方存在溢出漏洞,C语言最多。溢出如果处理不好,使的其他的程序的地址空间的内容更改,或者系统转而处理一些被刻意安排的指令。  指针的危险性就在这里。    指针可以加减的,根据类型每次前后移动,类型是32位就每次移动4个地址  罗嗦一堆,是不是想听的啊?
      

  16.   

    请问各位,PByte算是什么指针类型??delphi的帮助里面没有这个类型,而d5开发人员指南一书中关于内存映射文件所举的一个例子中用了这样一个类型,并声明了一个变量FData: PByte;而这个FData是作为存放MapViewofFile函数的返回值的变量,那么我想这个FData应该声明成Pointer类型才对,因为这个函数的返回值是Pointer类型阿,请大虾解答一下,谢谢!
      

  17.   

    我看到大家的帮助,理解了很多最后有点疑问就是那么指针变量(指针)应该是在内存中占四字节一个内存块了,它是一个32位的整数,指针变量的类型由它指向的变量的类型决定,它的值就是这个32位的整数,用Addr或@取,它指向的变量的值用变量名加^取,赋给一个同类型的变量不知道以上说法是否正确,如果对那么指针变量的存储的内存块也应该有个地址吧?这个地址也是一个指针吧?那不永远没有尽头了,请最后指教一下,谢谢各位!!!
      

  18.   

    指针就存在栈上,你在源码中声明一个指针变量的时候,编译器就会为你在栈上给指针预留一个4Bytes的空间。因为指针和其他类型并无多大区别。
      

  19.   

    var
      i: integer;  //占4个字节,存放一整数
      p: pointer;  //同样占4个字节,存放的也是一个整数
      pp: pointer; //看上面……
    假设i存放在编号$0001~$0004的内存中,p存放在$0028~$0031的内存中,pp存放在$1000~$1003空间中。执行下面的语句:
    i := 123;  //i的内容被赋予123
    p := @i;  //p的内容被赋予i的地址
    pp := @pp;  //pp的内容被赋予p的地址
    那么,$0001~$0004的内存里存放的数据就是123(i的内容),$0028~$0031里的数据就是$0001(p的内容),$1000~$1003的内存中存放的数据就是数字$0028了。看到了,指针是一种类型,它的形式是一个32位的数字,意义为引用的内存单元的编号。指针变量即是存放指针类型(32位数字)的变量,变量本身是需要存储空间的。也可以换种说法:“存放数据的内存块被称做变量,内存块的标号被叫做内存地址,在程序设计中也被称作指针,存放这种内存地址类型的就是指针变量了”,通过内存地址,你可以引用特定编号的内存中的内容
    例如:
    var 
      p: pointer;
      i: integer;
    i := 1024;
    p := pointer(i);
    或者
    integer(p) := 1024;
    都是可以的且效果相同,但是天知道1024单元存放的是什么东西
    在看下面的:
    var
      s: string;
      p: pointer;
    s := 'abcdef';
    p := @s[1];  //p里存放的是'a'的内存单元的地址
    p := integer(p) + 3;
    最后p里存放的是什么?当然是——字符'd'了
      

  20.   

    在System单元里面可以看到很多种类的指针变量类型,其实他们都是指针,只不过指的对象都是有类型的,所以单独定义一个类型,例如PInteger、PChar等等可以将这些类型看做Pointer这个变量类型的派生类型----用类的派生概念去理解,虽然不尽相同写任何程序的时候都应该学会用两中眼光去看待当前你正在书写的代码:
    1.编译器角度:所有变量都是有类型的,类型由编译器根据语言的规定去对待
    2.内存角度:所有的变量都是内存空间例如
    var
      PI:PInteger;
    begin
      PI:=Addr(Self.Tag);
    end;上面代码从内存角度去理解,PI就是一个内存中的空间,里面存放的内容是另外一个内存空间Self.Tag的内存地址(相对);从编译器角度去理解,PI是一个类型的实例,而Self.Tag也是一个类型的实例;最后把两种看待事物的角度联合起来上面的代码就很清楚了,编译器根据OP语言的规则在看待我们书写的代码的时候会使用类型这个概念去区分不同的代码内容和对这些内容的相关操作(这个地方和类的概念十分相似),但无论如何看待在编译以后程序加载到4G的进程空间的时候都要占据内存地址,这个时候实际上类型概念已经没有多大意义,但我们仍旧可以反过来看待各种空间的不同使用方式,这个方式就是由编译器去具体对待的....其实任何程序说白了都是由指针组成(因为任何代码最后都要进入内存,而对代码的访问就必须知道地址,地址就是指针,所以任何程序都是指针组成:看看TypInfo单元的RTTI定义可以帮助你理解这个东西),而任何程序的执行过程都是指针的跳转过程.....
      

  21.   

    是不是 '指针类型'和'记录类型' 经常一起使用啊!
    像:
    Type
       PNode = ^MNode;
       MNode = Record
    end;