psz := pchar(s);
pdw := pdword(psz);
dec(pdw);dec(pdw);dec(pdw);
dw1 := pdw^;
inc(pdw); dw2 := pdw^;
inc(pdw); dw3 := pdw^;
listbox1.items.add( format('[after cow]size:%d, ref:%d, len:%d',
[dw1,dw2,dw3]) );
end;
procedure tform1.button3click(sender: tobject);
begin
listbox1.items.clear;
end;
如果你对指针的概念比较清楚的话,上面的代码是不难理解的。下面是该程序的输出结果:
[current]size:22, ref:5, len:5
[before assign]size:22, ref:2, len:5
[after assign]size:22, ref:3, len:5
[after cow]size:22, ref:2, len:5
观察上述结果,可以得出几个结论:
1.“分配大小”和“字串长度”之间存在着一种固定的数量关系,即分配大小=字串长度+17。为什么会有这种关系?请你再看一看string类型的内存分布:(4字节)分配大小+(4字节)引用计数+(4字节)字串长度+(不定长)字符数组+(1字节)$0结束字符,4+4+4+(strlen)+1,应该是13+(strlen)才对,也就是说应该还有4字节的空间,其用途尚不清楚。值得一提的是,如果你将字符串清空,那么len的结果可能不是你所想象的0,而是一个让你大吃一惊的数字。