更奇怪的一个string问题! ( 积分: 50 )

  • 主题发起人 主题发起人 justinfoo
  • 开始时间 开始时间
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
时,引申出来

不得其解。。。
 
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
时,引申出来

不得其解。。。
 
问题一:
因为p的类型是PChar,如果你单独写p,那么可以认为它是个字符串。但如果你写p^就不一样了。因为p是“字符指针”,它相当于p:^Char;也就是说在定义一个字符指针变量的时候,PChar和^Char的定义形式是可以互换的。因此对p^的理解是指p指向的那个字符,而不是p指向的那个字符串。楼主有此疑问大概就是错把p:PChar当成是指向字符串的指针了吧。这可能是我们在很多情况下都看到能将PChar和String两种类型的数据互相转换而造成的一种误解。
问题二:
目前我也搞不清楚为什么这两行的运行结果会不同,但按理来说,不管是Line A和Line B,都应该会报非法内存访问错误的。因为我个人觉得问题不在Line A或者Line B那儿,而在abc那个过程里面。
 
1、当然是这样。你想想 pchar的结构
2、常量无法修改。明白?
 
应该就是这样了。谢谢
 

Similar threads

回复
0
查看
863
不得闲
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
后退
顶部