回 帖 发 新 帖 刷新版面

主题:帮忙分析一行语句,我一直看不懂,希望句子的主人或看的懂的帮忙分析下

if CompareMem(@A[Low(A)], @B[Low(B)], Length(A)) then
 ···;

@A[Low(A)]
这个,按我的理解,似乎可以分为两个部分:@A和Low(A)
不知道有没有分错?
如果没分错,该怎么理解?

回复列表 (共2个回复)

沙发

哦,我是“句子的主人”。http://www.programfan.com/club/post-249123.html

CompareMem函数的原型是:
function CompareMem(P1, P2: Pointer; Length: Integer): Boolean; assembler;
也就是说,第一、二个参数是两个起始地址,第三个参数是连续的字节数。
这个函数用于比较从P1开始Length个字节的内存块,与从P2开始Length个字节的内存块,如果两个内存块内容相同,则返回True,否则返回False

CompareMem(@A[Low(A)], @B[Low(B)], Length(A)*SizeOf(Integer)) 
在向你提供这段代码的原贴里,是比较两个数组的所有元素是否一一对应相同。
Low(A)其实就是返回数组A最小的元素下标值,在原贴里,其值为0。
这样,@A[Low(A)]就等效于 @A[0]。
@A[0]的意思就是数组A第一个元素的地址。

Length(A)*SizeOf(Integer)  这个式子的返回值是 数组元素数 乘以 每元素的字节数
Integer型在Win32里占据4字节空间,所以 这个式子就等于 Length(A) * 4

在原贴里,
CompareMem(@A[Low(A)], @B[Low(B)], Length(A)*SizeOf(Integer))
就等效于
CompareMem(@A[0], @B[0], 8 * 4) 

当然,在实际编程中,不建议CompareMem(@A[0], @B[0], 8 * 4)这样写。

这样解释,能够理解了吗?
:)

板凳

谢谢啊~你的解释很仔细,实在是太完美了,我一看就懂~
[em4]

我来回复

您尚未登录,请登录后再回复。点此登录或注册