; j:=K;//计数器应该加1,因为j的指针指向了他,使用者又多了一个
showmessage('现在计数器:'+Inttostr(MyAnsiString^.ReferencCount));
showmessage('长度为:'+Inttostr(MyAnsiString^.Length));
SetLength(j,100);//计数器应该减1,因为j的指针指不再指向他,使用者少了一个
showmessage('现在计数器:'+Inttostr(MyAnsiString^.ReferencCount));
showmessage('长度为:'+Inttostr(MyAnsiString^.Length));
SetLength(k,100);//k内存被重新分配,那么这片数据的计数器再减去一个,即为0。
//然而因没有使用者该内存区域已经被自动释放所以这里再去读数的话就是一些随机数据
showmessage('现在计数器:'+Inttostr(MyAnsiString^.ReferencCount));
showmessage('长度为:'+Inttostr(MyAnsiString^.Length));
end;
理论上来说能模拟实现AnsiString的一些功能,通过这些可以看到AnsiString不过是动态数组的一种形式。
3.WideString:宽字符串,由WideChar组成,以Nil结尾.
Type
TWideString=record
allocSiz: LongWord;//分配的大小
Length:LongWord; //字符串长度
Data:array[1..(Length+1)] of WideChar;
end;
有结构可以看出,WideString和AnsiString很类似,但是他没有回收机制。不能进行生存期自管理。
但是在处理上还是较CC++效率高上许多。
4.Pchar:与其说成是字符串到不如说他是指针更准确一些。
Type
TPchar=^Char;
Pchar是为了和C++兼容的实际上它是指向字符的指针。从这个字符开始到后面第一个NULL字符为止都是
Pchar字符串的内容,也就是说PChar是它内容的首地址,因为Pchar并非结构而是一种指针所以Pchar的
下限是0.
var
A:Pchar;
...
A:='1234567890';
A[0]:='a';//这一句是合法的
看看如下代码就明白了:
var
k:array of char;
p:Pchar;
i:Integer;
begin
SetLength(k,20);
FillMemory(@k[0],Length(k),Byte('A'));
i:=3; //i只要比20小,大于等于0,随你调整看看不同的结果。
k[i]:=#0;
p:=@k[0];
&nbs
上一页 [1] [2] [3] [4] [5] [6] 下一页