为什么字符串'aaa' 可以直接赋值给 string , ‘aaa’也可以直接赋值给pcahr 但是 在设了一个中间变量 t:string 时候 先把'aaa'给t ,然后 t 无法赋值给 pchar?
解决方案 »
- 0.0 is not a valid timestamp???
- delphi如何实现判断QQ在线啦?
- 有没有要《深入核心——VCL 架构剖析》的?
- 如何清空窗体(Form)上的所有Edit框??
- 弱弱的问:为什么使用VC spy++无法查看tlabel?
- 我想打开filelistbox1中所选中的文件,该怎么做
- 关于DBGrid的列怎样用列名区分?
- Packed Record长度的问题
- 请问大家对这个公司了解吗?主要开发什么产品?
- 救命 delphi adoquery+dbgrid+mysql 修改值=原值时提示"无法为更新定位行,一些值可能已经在最后一次读取后已更改"
- Edit.Text输出的小数点问题
- 请大家帮忙看一段程序.我想在richedit中选中某行,然后将其颜色改变的.有点问题.谢谢!
即:Str指向'aaa'所在的内存空间;
只有当以后Str的内容改变时,例如:Str := InttoStr(Self.Handle)+TimetoStr+Str;
时,程序才为Str另辟内存空间,并将Str指向这个空间。
----这就是Copy On Write技术。
即:Str指向'aaa'所在的内存空间; 又怎么解释?
地址空间的赋而已,,,,
t:string;
p1:pointer;
begin
t:='aaa';
new(p1);
p1:=@t;
label1.Caption:=p1^;
dispose(p1);
end; 我想用 无类型指针 这代码怎么修改下?
对于CPU来说,内存中的数据没有类型。只有0和1。CPU只识得“以字节为单位取数”我说过了,'aaa'在编译前期(不是编译前)就有地址了,你还问“什么类型”?地址啊!编译器直接使用它的地址(也是一个常数)
t:string;
p1:pchar;
begin
t:='aaa';
new(p1);
p1:=@t;
label1.Caption:=p1^;
dispose(p1);
end;
这个又错在哪里?
前面的您已经消化了吗?
问得好快!var
t:string;
p1:pointer;
begin
t:='aaa'#0;
p1:=@t[1];
label1.Caption:=StrPas(PChar(p1));
end;
如果你希望自己new、dispose:var
t:string;
p1:pointer;
begin
t:='aaa'#0;
new(p1);
p1:=@t[1];
label1.Caption:=StrPas(PChar(p1));
p1 := nil; {注意,加这一句!}
dispose(P1);
end;
label1.Caption:=StrPas(PChar(p1));
里面的PChar强制转换是多余的,直接 label1.Caption:=StrPas(p1); 也可。
Str1, Str2 : string;
P : PChar;
begin
Str1:= 'aaa';
Str2:= 'aaa';
P := PChar(Str1);
Showmessage(Format('Str1 = %p, Str2 = %p, P = %p',[Pointer(Str1),Pointer(Str2),Pointer(P)]));
{看一下,地址是一样的。也就是说,Str1、Str2、P在此时都指向了'aaa'所在的内存空间(修改了引用计数)}
end;Copy On Write技术很复杂。我一言两语也解释不全。况且我本人也没有全懂。需要大家一起慢慢了解了。
Str1, Str2 : string;
P : PChar;
begin
Str1:= 'aaa';
Str2:= 'aaa';
P := PChar(Str1); {注意这里是取Str1的地址}
Showmessage(Format('Str1 = %p, Str2 = %p, P = %p',[Pointer(Str1),Pointer(Str2),Pointer(P)]));
{看一下,地址是一样的。也就是说,Str1、Str2、P在此时都指向了'aaa'所在的内存空间} {接下来,Str1改变,程序为Str1另辟内存空间}
Str1 := InttoStr(Self.Handle) + Str1;
Showmessage(Format('Str1 = %p, Str2 = %p, P = %p',[Pointer(Str1),Pointer(Str2),Pointer(P)]));
{看一下地址的变化,那么,原本指向Str1[1]的P,此时该指向如何了?} Showmessage(StrPas(P));
Showmessage(Str1);
{仍然指向'aaa'处,并不是新的Str1}
end;{下了,休息了 ^_^ }