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)是怎么个关系?请教!可以再加分,只要您能给我一个正确和有道理的答案。在线等!
没明白这段代码实现的原理是什么?Dec(p)与sizeof(TMytype)是怎么个关系?请教!可以再加分,只要您能给我一个正确和有道理的答案。在线等!
解决方案 »
- 如何判断dbgrideh中单元格内容的变化
- delphi7类型问题求解
- SuperObject 解析json 问题
- 使用DOCK PRESIDENT控件做停靠窗口,如何在程序启动的时候就把需要停靠的窗口停靠在想要的位置?
- 高分求源码:使用什么序列号加密软件比较好?
- 排序的問題
- 一个网络下载中网址的问题。
- 可用分超过专家分,散分。
- Indy控件的发邮件被TOM,163,Sina拒收,怎么办?!难道要就此告别Indy了吗?
- delphi中如何将一整个文件读入内存,文件大小有64M
- 很傻的问下各位:delphi翻译的程序能在Window7、Vista下运行吗
- Windows7 终于要来了,我的老奔不会再也奔不动了(P4 3.0E HT+1G DDR400)
如果X 是一个指向某个类型的指针 如果你直接对这个X进行加减的话, 他的值(注意是地址值) 会按照他指向类型的大小(这里的大小是按照字节来描述的)的整倍数加减比如 那个P 是一个MyType的指针.
如果你对P-1 , 那么 P这个地址本来以前假如说是1000 那么他不会变成999 而是变成1000-SizeOf(TMyType)明白了吧.如果还没明白 你可以尝试将这些指针强制转化为 integer 然后 ,输出你会发现这个问题的.
羞愧难当!见笑了。(不是问题的问题,以后再CSDN上写东西前,不回再喝酒了。:))
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;