- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有方法(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/
考虑以下场景: type PStructureForSomeCDLL = ^TStructureForSomeCDLL; TStructureForSomeCDLL = record pName:
我有方法(Delphi 2009): procedure TAnsiStringType.SetData(const Value: TBuffer; IsNull: boolean = False);
我是一名优秀的程序员,十分优秀!