这样把字符数组转换成string正确吗?
procedure TForm1.Button1Click(Sender: TObject);
var
vp: array[0..3] of Char;
s: string;
begin
VP[0] := 't';
VP[1] := 'e';
VP[2] := 's';
VP[3] := 't'; s := string(vp);
ShowMessage(s);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
vp: array[0..3] of Char;
s: string;
begin
VP[0] := 't';
VP[1] := 'e';
VP[2] := 's';
VP[3] := 't'; s := string(vp);
ShowMessage(s);
end;
正确的。
如果是动态数组,则需要以#0字符作为字符串的结尾。例如:procedure TForm1.Button1Click(Sender: TObject);
var
vp: array of Char;
s : string;
begin
SetLength(vp, 5);
VP[0] := 't';
VP[1] := 'e';
VP[2] := 's';
VP[3] := 't';
VP[4] := #0;
s := string(vp); //这里,不能简写成 s := vp 了
ShowMessage(s);
end;
ShowMessage(vp);
jadeluo 老师能否解释一下为什么静态数组不用#0结束,而动态数组必须得用#0结尾的原因吗
var
vp: array[0..3] of Char;
s: string;
begin
VP[0] := 't';
VP[1] := 'e';
VP[2] := 's';
VP[3] := 't'; setlength (s,sizeof(vp));
CopyMemory(@s[1],vp,sizeof(vp));
ShowMessage(s);
end;
静态数组时:
s := String(vp);
或者
s := vp; (完全等价于前者, 只是把强制类型转换的String给省略了, 编译出的代码与前者是一样的) 所对应的编译结果是这样的:
lea eax,[s]
lea edx,[vp]
mov ecx, 4 //4就是vp数组的大小
call @LStrFromArray
LStrFromArray是根据ecx内的值来确定字符数组的结束位置的,这样的代码是能正确运行的。
动态数组时:
s := String(vp);
所对应的编译结果是这样的:
lea eax, [s]
mov edx, [vp]
call @LStrAsg
LStrAsg是根据字符数组中的#0来确定结束位置的,所以vp数组中必须要以#0作为结束符。