procedure TForm1.Button1Click(Sender: TObject);
var
s: string;
pc: PChar;
begin
s:='abcdefg12345';
pc:=PChar(s);
ShowMessageFmt('%s=%s ?',[IntToHex(Integer(@s[1]),4), IntToHex(Integer(@pc[0]),4)]);
end;ShowMessageFmt显示结果,内存地址不一致。
如果是内存复制,那么我把s赋1G字节的值,执行pc:=PChar(s);瞬间完成。请高手讲解。
var
s: string;
pc: PChar;
begin
s:='abcdefg12345';
pc:=PChar(s);
ShowMessageFmt('%s=%s ?',[IntToHex(Integer(@s[1]),4), IntToHex(Integer(@pc[0]),4)]);
end;ShowMessageFmt显示结果,内存地址不一致。
如果是内存复制,那么我把s赋1G字节的值,执行pc:=PChar(s);瞬间完成。请高手讲解。
解决方案 »
- delphi 在读写一个Excel时,用户打开其他的Excel文件并关闭,会出现OLE error 800A01A8的错误,如何解决?
- Delphi的ListBox有条数限制吗?
- 求:CreateProcess和TerminateProcess的用法实例,用于打开和关闭外部程序?
- 如何将数据库中的数据导出成XML
- 两表查询的SQL语句问题
- 饭桶老师来接分
- 大虾:问一个项目中窗体的创建问题。用那一种方法最好?
- TCoolBar的动态增加控件问题
- Image改变大小的问题
- 如何自己编写程序注册com服务?
- label如何实现程序运行后使其内容可选定和复制(我用的是DELPHI5)
- 如何取出TADOQuery中的记录
const
s: string='abcdefg12345';
var
pc: PChar;
begin
pc:=PChar(s);
ShowMessageFmt('%s=%s ?',[IntToHex(Integer(@(s[1])),4), IntToHex(Integer(pc),4)]);
end;2:
var
s: string;
pc: PChar;
begin
s:='abcdefg12345';
pc:=PChar(s);
ShowMessageFmt('%s=%s ?',[IntToHex(Integer(s),4), IntToHex(Integer(@pc[0]),4)]);
end; 如楼上所讲,s作变量时会有引用计数处理,当执行s[1]这样的操作时,会复制一份string,这时地址看起来就不一样了,
1 但用const修饰时,就没有引用计数的问题了,
2 直接显示s的地址时,也不会引起引用计数的问题