procedure Move( const Source; var Dest; count : Integer );
var
S, D: PChar;
I: Integer;
begin
S := PChar(@Source);
D := PChar(@Dest);
if S = D then Exit;
if Cardinal(D) > Cardinal(S) then
for I := count-1 downto 0 do
D[I] := S[I]
else
for I := 0 to count-1 do
D[I] := S[I];
end;=========================================================================================
1> Source , Dest 被定义为什么类型?根据下面程序分析可知是一个字符串型,但为什么省略了String?
2> 在进行字符的传送时,为什么要判断源串与目标串的地址空间大小的问题,对于串指针,是指向首字
符的,不会指向尾字符,更不用逆序传字符。还请delphi高人指点。
解决方案 »
- 替换符合条件前5行的某个字段的值为a
- delphi7打开项目提示找不到类TRzGroupBox??
- 开两百分寻求好名字,另外还有一个帖
- 这里的人真好
- 打开文件(保存文件)的对话窗 怎么才能做到...?
- 问题的关键在哪里:发邮件程序?
- 请教:在调用函数BlockRead()的时候,老是出现 I/O error 998的错误,通常是什么原因?
- fastreport
- 请教一下DecodeTime()函数和EncodeTime()的使用方法?
- initialized
- ◆用过东进语音卡进行二次开发的朋友请进◆
- 怎么在image控件上实现:用鼠标框选(象在桌面一样按住鼠标左键进行框选,有个虚框出来,框完后虚框消失,得到相应的坐标)
PUSH EDI MOV ESI,EAX
MOV EDI,EDX MOV EAX,ECX CMP EDI,ESI
JA @@down
JE @@exit SAR ECX,2 { copy count DIV 4 dwords }
JS @@exit REP MOVSD MOV ECX,EAX
AND ECX,03H
REP MOVSB { copy count MOD 4 bytes }
JMP @@exit@@down:
LEA ESI,[ESI+ECX-4] { point ESI to last dword of source }
LEA EDI,[EDI+ECX-4] { point EDI to last dword of dest } SAR ECX,2 { copy count DIV 4 dwords }
JS @@exit
STD
REP MOVSD MOV ECX,EAX
AND ECX,03H { copy count MOD 4 bytes }
ADD ESI,4-1 { point to last byte of rest }
ADD EDI,4-1
REP MOVSB
CLD
@@exit:
POP EDI
POP ESI
是指针地址。
不要以为这样做是为了判断同一个字串的覆盖方式。
其实,是内存地址才是真实考虑的东西。
如果,你连续分配了2个变量A,B。
那么,简单可以理解成,内存中 A 后面紧接着就是 B。
而Cardinal(A) 小于 Cardinal(B)。
for 循环里,是用 downto 还是用 to ,这时候就明白了吧?