Note: If X is a pointer type, it decrements X by N times the size of the type pointed to. Thus, giventype  PMytype = ^TMyType;andvar  P: PMyType;the statementDec(P);decrements P by SizeOf(TMyType).
没明白这段代码实现的原理是什么?Dec(p)与sizeof(TMytype)是怎么个关系?请教!可以再加分,只要您能给我一个正确和有道理的答案。在线等!

解决方案 »

  1.   

    意思就是
    如果X 是一个指向某个类型的指针  如果你直接对这个X进行加减的话, 他的值(注意是地址值) 会按照他指向类型的大小(这里的大小是按照字节来描述的)的整倍数加减比如 那个P 是一个MyType的指针.
    如果你对P-1 , 那么 P这个地址本来以前假如说是1000 那么他不会变成999  而是变成1000-SizeOf(TMyType)明白了吧.如果还没明白 你可以尝试将这些指针强制转化为 integer 然后 ,输出你会发现这个问题的.
      

  2.   

    OK.OK.迷到了不知哪一点上,本没想那么多,只是看了一下这个DELPHI 的 HELP,突然不知道哪来的怪想法,觉得通过DEC(P)能求出SIZEOF(TYPE)来,就一直.....,其实SIZEOF本来就是操作符,DEC(P),平凡的指针算数,当然是按SIZEOF(TYPE),其中 P : TYPE.
    羞愧难当!见笑了。(不是问题的问题,以后再CSDN上写东西前,不回再喝酒了。:))
      

  3.   

    首先,关键的一点:“指针是有类型的”(无类型指针Pointer除外)。然后,这些解释的意思就是说类型指针的自增自减操作都是以其类型的长度为单位。请看演示:
    type
      PTMyType = ^TMyType;
      TMyType = record
        S: string[10];
        I: Integer;
        C: Char;
      end;{TMyType是一个自定义的记录类型,每条记录长度是10+4+1=15个字节}var
      MyArr : array[1..3] of TMyType = ((S:'first rec'; I:1; C:'1'),
                                        (S:'second rec';I:2; C:'2'),
                                        (S:'third rec'; I:3; C:'3'));procedure TForm1.Button1Click(Sender: TObject);
    var
      PWrd: PWord;   {字指针。每Word的长度是2字节}
      PByt: PByte;   {字节指针。每Byte是1字节}
      PMy : PTMyType;{指向TMyType型的指针}
      Temp: Integer;
    begin
      Temp := $04030201;
      PWrd := @Temp;
      PByt := @Temp;
      ShowmessageFmt('%.4x', [PWrd^]);{'0201'}
      Inc(PWrd);
      ShowmessageFmt('%.4x', [PWrd^]);{'0403'}{可见PWord指针每次自增自减的单位都是Word类型的长度}
      {再看一下PByte类型}
      ShowmessageFmt('%.2x', [PByt^]);{'01'}
      Inc(PByt);
      ShowmessageFmt('%.2x', [PByt^]);{'02'}{可见PByte指针每次自增自减的单位都是Byte类型的长度}
      {用自定义类型测试:}
      PMy := @MyArr[3];{首先让PMy指向MyArr的第三条记录}
      Showmessage(PMy^.S);{'third rec'}
      Dec(PMy);
      Showmessage(PMy^.S);{'second rec'}
      Dec(PMy);
      Showmessage(PMy^.S);{'first rec'}
      Inc(PMy, 2);{自增 2 }
      Showmessage(PMy^.S);{'third rec'}
    end;
      

  4.   

     to lihuasoft :  大拇哥!