一个奇怪的pchar和string的问题 ( 积分: 50 )

  • 主题发起人 主题发起人 nieyunfeng
  • 开始时间 开始时间
N

nieyunfeng

Unregistered / Unconfirmed
GUEST, unregistred user!
各位大虾:
有一个小问题一直想不透彻,就是pchar和string的转换问题!
比如:var p:pchar;k:string;
begin
k:='hello';
p:=pchar(k);此时p得到的应该是指向k的指针吧,但是当k改变时:
k:=k+'delphi';
此时k的值是‘helloworld’,但p的值却还是‘hello’,就是说开始p是指向k的,但是k改变后为什么p不会改变,难道k又开辟出了另外一块内存么?这个过程是怎么样的一个内存处理过程啊?小弟一直想对此很困惑但是又很想知道个究竟,有哪位大哥大姐知道还望能指点迷津,不胜感激!
 
p:=pchar(k)
并不得一定得到 k的指针,除非你用 @k[1]
而 k:=k+'delphi'的时候系统会 重新分配内存,地址已经变了。
 
'hello'是常量在内存的常量区
K:=K+'delphi';重新分配内存
 
对被引用的字符串变量赋值时,
内存管理器会自动进行一个写复制(write copy)操作。
 
p:=pchar(k);
强制类型转换
 
同意,p:=pchar(k);只是类型转换并不是将P指向K
 
p:=pchar(k);
p 就是指向 k, integer(@k[1]) 和 integer(p) 值是相同的。
k:='hello'
//此时的 integer(@k[1])
k:=k+'delphi'
//与此时的 integer(@k[1]) 是不同的。说明 k 的内存重新分配了。
 
pchar和string的转换问题
1。pchar -> string 产生内存复制
2。string -> pchar 不产生内存复制
 
同意:p:=pchar(k);做用只是强制类型转换,并不能将K的地址给P
 
后退
顶部