var
P2:PChar;
S1:String;
begin
S1:='Test...';
P2:=StrNew(PChar(S1)); 。。(1)
....
end;请问这两条语句有何区别?
P2:=StrNew(PChar(S1));与P2:=PChar(S1);如果将语句(1)换成P2:=PChar(S1);可以吗?
P2:PChar;
S1:String;
begin
S1:='Test...';
P2:=StrNew(PChar(S1)); 。。(1)
....
end;请问这两条语句有何区别?
P2:=StrNew(PChar(S1));与P2:=PChar(S1);如果将语句(1)换成P2:=PChar(S1);可以吗?
P2:=PChar(S1); P2指向S1[1]的地址,即P2 := @S1[1]
P2:=PChar(S1); P2指向S1[1]的地址,即P2 := @S1[1]
// P2:=StrNew(PChar(S1));开辟一块新内存,拷贝S1,P2指向新内存地址;
// P2:=PChar(S1); P2指向S1[1]的地址,即P2 := @S1[1]如果对P2的内容进行改变,是否S1的内容也会改变?
P2:=StrNew(PChar(S1));P2指向的是复制S1内容的内存地址,修改P2,S1的内容不会改变。
P2:=PChar(S1); P2和S1用的是同一内存地址,修改P2,S1的内容也改变了。
P2:=PChar(s1);
P2:='12345'
这时,是否S1的值也会变成'12345',但我在程序中运行这段代码后,S1的值并没有改变呀1
const Tempstring: array[0..6]of char = '12345'#0;
P2 := @Tempstring;
P2已经不是原来地址@S1[1]了,所以S1内容没有变。
string=AnsiString;//类似于BCB的一个类,只不过没得属性和方法,只有operate
不过,,,每申明一个string,就有不同的实例,而不是指针
我按您提示的方法去试了一下,但报了错呀。
....
MOVE('12345',p2^,5);
...
提示错误:Access violation at address 004028CB in module 'aa.exe'.Write of address 00452464.
这样好像通不过呀。
用
var
S1: string;
P2: Pchar;
begin
S1 := 'abcde';
SetLength(S1,6);
P2 := Pchar(S1);
Move('12345',P2^,5);
Caption := S1;
end;或者
var
S1: string;
P2: Pchar;
begin
S1 := 'abcde';
P2 := @S1[1];
Move('12345',P2^,5);
Caption := S1;
end;
就不会出错,没有仔细研究,不知道是什么原因。
S1: string;
P2: Pchar;
begin
S1 := 'abcde';
SetLength(S1,6);
P2 := Pchar(S1);
Move('12345',P2^,5);
Caption := S1;
end;在这段程序中,如果SetLength(s1,6)这里长度是6的话,那么在move后,s1会多出一个字符,如果是5的话,s1就为12345,不会多出字符。
但这是为什么呢?书上讲到s1:='abcde'这样赋值,就已经给s1确定了长度呀,为何还要用setlength()再将分配长度?第二个程序好像能理解,因为赋给p2的是s1字符串的首地址,执行move操作,p2的值自动加1,连续加5次,给p2所指向的内存赋值为1,2,3,4,5。由于p2是指向s1的内存空间,所以s1的值也就发生改变。但第一种方法如何理解?还请高手指点!
前面运行到Move('12345',P2^,5)的时候报错,怀疑是S1的自动设置的指针或分配的内存有问题,所以用setlength重新设置S1。
至于长度,可以忽略。