gpt4 book ai didi

delphi - 当 AnsiString 转换为 PAnsiString 时会发生什么?

转载 作者:行者123 更新时间:2023-12-03 15:03:15 25 4
gpt4 key购买 nike

我有方法(Delphi 2009):

procedure TAnsiStringType.SetData(const Value: TBuffer; IsNull: boolean = False);
begin
if not IsNull then
FValue:= PAnsiString(Value)^;
inherited;
end;

这是基类上的一个抽象方法,其中“Value:Pointer”需要相应数据的指针,如下:

String = PString
AnsiString = PAnsiString
Integer = PInteger
Boolean = PBoolean

所以我尝试像这样传递值:

var
S: AnsiString;
begin
S:= 'New AnsiString Buffer';
SetBuffer(PAnsiString(S));
end;

但是从 AnsiString 到 PAnsiString 的转换不起作用,我知道为什么,但我想知道转换的结果是什么。所以我写了一个简单的测试:

var
Buffer: AnsiString;
P1: Pointer;
P2: Pointer;
P3: Pointer;
P4: Pointer;
begin
P1:= PAnsiString(Buffer);
P2:= Addr(Buffer);
P3:= @Buffer;
P4:= Pointer(Buffer);
P5:= PChar(Buffer[1]);

WriteLn('P1: ' + IntToStr(Integer(P1)));
WriteLn('P2: ' + IntToStr(Integer(P2)));
WriteLn('P3: ' + IntToStr(Integer(P3)));
WriteLn('P4: ' + IntToStr(Integer(P4)));
WriteLn('P5: ' + IntToStr(Integer(P5)));
end;

结果是:

P1: 5006500
P2: 1242488
P3: 1242488
P4: 5006500
P5: 67

地点:

- P2 and P3, is the address of Buffer: AnsiString 
- P5 is the Char Ord value of Buffer[1] char, in this case "67 = C"
- How about P1 and P4?

P1和P4的含义是什么?

最佳答案

AnsiString 是作为指针实现的。 AnsiString 变量只保存一个地址。地址是字符串中第一个字符的地址,如果字符串为空,则为 nil。

PAnsiString 是指向 AnsiString变量的指针。它是一个指向字符串第一个字符的指针。当您说 PAnsiString(Buffer) 时,您是在告诉编译器将 Buffer 中的指针视为指向 AnsiString 的指针而不是指向字符数据的指针。地址5006500是字符串第一个字符C的位置。

内存中有一条表示字符串的记录:

                +-----------+                | $ffffffff | -1 reference count (4 bytes)                +-----------+Buffer:         | $00000001 | length (4 bytes)+---------+     +-----------+| 5006500 | --> |       'C' | first character (1 byte)+---------+     +-----------+                |        #0 | null terminator (1 byte)                +-----------+

Buffer 保存其中包含 C 的字节的地址。您将其类型转换为 PAnsiString 类型,而不是 AnsiString。你告诉编译器你有这样的布局:

                                  +-----------+                                  |       ... |                                  +-----------+Buffer:                           |       ... |+---------+     +-----------+     +-----------+| 5006500 | --> | $00000043 | --> |   garbage | first character+---------+     +-----------+     +-----------+                                  |       ... |                                  +-----------+

当我推理指针时,我会像这样画图。如果您不在办公 table 上放一些纸,那么您就是在伤害自己。

关于delphi - 当 AnsiString 转换为 PAnsiString 时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/549469/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com