J
justinfoo
Unregistered / Unconfirmed
GUEST, unregistred user!
procedure TForm1.Button1Click(Sender: TObject);
var
s, s1, s3, s4: String;
procedure abc(Value: String);
var
p: PChar;
begin
p := PChar(Value);
p^ := 'a';
end;
begin
s3 := '1234';
s4 := '5678';
s := s3 + s4
{Line A}
//s := '12345678'
{Line B}
s1 := s;
abc(s1);
showmessage(s1 + ' ' + IntToStr(integer(s1)));
showmessage(s + ' ' + IntToStr(integer(s)));
end;
两个问题:
第一:
程序运行一下,屏幕显示:
a2345678 13906896
a2345678 13906896
s1和s的值为什么不是a ?
p^ := 'a'
为什么只把字符串s1和s的第一个字符改成了'a' ?
或者说,为什么用p^这种形式赋值,只赋第一个字符,而不是p所指向的整个字符串?
第二:
把 Line A 注释掉,把 Line B 恢复正常。运行程序,内存会报错。
为什么s := s3 + s4
跟s := '12345678'
这两种赋值方式,为什么会得到不同的结果?
(理论上说,当s := '12345678'时,内存开辟一个区域,然后s指向这个区域。而当s := s3 + s4时,由于copy-on-write机制,内存也会新开辟一个区域,然后s指向这个新的区域。)
以上问题在浏览
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3251928
时,引申出来
不得其解。。。
var
s, s1, s3, s4: String;
procedure abc(Value: String);
var
p: PChar;
begin
p := PChar(Value);
p^ := 'a';
end;
begin
s3 := '1234';
s4 := '5678';
s := s3 + s4
{Line A}
//s := '12345678'
{Line B}
s1 := s;
abc(s1);
showmessage(s1 + ' ' + IntToStr(integer(s1)));
showmessage(s + ' ' + IntToStr(integer(s)));
end;
两个问题:
第一:
程序运行一下,屏幕显示:
a2345678 13906896
a2345678 13906896
s1和s的值为什么不是a ?
p^ := 'a'
为什么只把字符串s1和s的第一个字符改成了'a' ?
或者说,为什么用p^这种形式赋值,只赋第一个字符,而不是p所指向的整个字符串?
第二:
把 Line A 注释掉,把 Line B 恢复正常。运行程序,内存会报错。
为什么s := s3 + s4
跟s := '12345678'
这两种赋值方式,为什么会得到不同的结果?
(理论上说,当s := '12345678'时,内存开辟一个区域,然后s指向这个区域。而当s := s3 + s4时,由于copy-on-write机制,内存也会新开辟一个区域,然后s指向这个新的区域。)
以上问题在浏览
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3251928
时,引申出来
不得其解。。。