1.2是同理.
PChar和^Char是相同类型,但它们是指针.指针只是指明地址所在,所以你直接赋值就不能实
现,而你加上PChar(p)则是将其变为字符串指针,
3.我们指明类型为string时,实际上是默认的AnsiString类型.(String分两种类型,下面有介绍)
Delphi会把AnsiString存储成一个指向记录的指针,但该指针指向记录的Data成员的开始
地址,而不是记录本身的开始地址,所以直接调用@string得到的并不是它数据的开始地址,而
只是string的开始地址.即string实际上也是指针,所以它用PChar也很好就将String转换为
PChar,而Char是代表具体的字符,所以若你的资料是Char(下面有例子),你直接调用@string
时就不会出错.
下面是找到的一点资料.
string分两种,一种是与Pascal传统string相兼容,叫ShortString,
; 它的存储结构如下:
; ;+---------------------+ ;
; ;| 1Byte | ;字符串内容 |
; ;+---------------------+
; ;0 ; ; ; 1 ......
; ; 其中第一个字节为字符串的长度。
; ; 所以ShortString所能包括的字符串长度不能大于255。
; 另一种是叫长字符串AnsiString, ;它就是一个指向字符串的指针,不过具体的存储有些特别。
; 它的存储结构如下:
; +-----------------------+
; | 4B | 4B | ;字符串内容 |
; +-----------------------+
; -8 ; -4 ; 0 ;......
; 其中,AnsiString指向字符串第一个字符,
; 在第一个字符的反方向第1到第4的4个字节表示字符串长度,第5到第8的4个字节表字符串
被引用的次数。
例子:
procedure TForm1.Button3Click(Sender: TObject);
var ;str:Shortstring;//返回'.sdfsadf',前面多一个点,因为是从1字节开始的,而第1字节是其长度并不是实际内容.
//var str:string;//我们选的string,实际上是AnsiString;//这是出的乱字符
//var ;str:array[0..7] of Char;//返回值是正常的
; ;p:^char;
; ;x:Char;
; ;P1
Char;
begin
; str:='sdfsadf';
; p:=@str;
; p1:=PChar(p);
; x:=str[2];
; ShowMessage(string(p));
; showmessage(string(p1));
end;