为什么不允许将 PChar 的内容打印为指针

Why it's not allowed to print the content of PChar as a pointer

我有以下程序。

var a: PChar := PChar('abc');
ShowMessage(Format('%p - %p', [@a, a]));

当我 运行 它时,我得到了这个错误:

Project Project1.exe raised exception class EConvertError with message 'Format '%p - %p' invalid or incompatible with argument'.

问题是 a 无法格式化为 %p。但据我了解,PChar 被定义为^Char。所以 PChar 本质上是指向 Char 的指针。这是一个指针。为什么不能格式化为%p?以下代码可以正常工作:

var c: Char := 'x';
var a := @c;

Format('%p - %p', [@a, a]);   // 0019F364 - 0019F36A

Format()的最后一个参数是一个array of const(本质上是一个TVarRec的数组)。有类型的 PChar 指针存储在 TVarRec.VPChar 字段 (TVarRec.VType=vtPChar) 中,而无类型的指针存储在 TVarRec.VPointer 字段 (TVarRec.VType=vtPointer) 中。仅 VPointer 字段支持 %p 说明符。 VPChar 字段仅支持 %s 说明符。

因此,如果您想使用 %p.

,则必须 type-cast PCharPointer

我已就此事向 Embarcadero 提交了一份报告:

RSP-37775: Update SysUtils.Format() to allow %p for all types of pointers