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高人指点。
解决方案 »
- 请问下,我要编写一个程式用于打开文件,应该要写么写代码?
- 请问如何搜索论坛帖子..
- 用FastReport打印OLE流对象ACD图纸?急用
- ADOQuery已经查询了一个表,但是如何知道各个字段在数据库中设置的默认值
- 更新修改表
- 关于if 语句的问题
- 时间戳url在哪里?
- 如何(可以)让国外的用户给自己汇款吗?
- 有关SQL的问题。当我执行Query1.SQL.Add('select * into "e:\StockAcc.dbf" from CUSTstockinfo');这条语句时,报错。
- 如何调用另一窗体的函数
- ◆用过东进语音卡进行二次开发的朋友请进◆
- 怎么在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 ,这时候就明白了吧?