8

我知道在 Delphi 中,一个空字符串(AnsiString 或 WideString)可以用一个 nil 指针表示,也可以用一个指向实际空字符串的指针表示。

通过实验,我已经在 Delphi XE2(具有特定的编译器设置)中证明了这一点PChar('') <> nil。但这是否得到保证,或者它可能会在未来的版本中发生变化,或者取决于某些编译器设置?

我正面临信任危机。如果有人能给我一个明确的答案,我将不胜感激。

4

1 回答 1

11

是的。从字符串文字到 PChar 的类型转换永远不会是空指针。从相同字符类型的字符串到 PChar 的类型转换也不会为空。(字符串到 PChar、AnsiString 到 PAnsiChar 等)

但是,对 PChar 的其他事物的类型转换可能为空。(指向 PChar 的指针、指向 PWideChar 的 AnsiString 等)

文档在字符串类型主题的混合 Delphi 字符串和空终止字符串部分中对此进行了介绍:

您还可以将 UnicodeString 或 AnsiString 字符串强制转换为以 null 结尾的字符串。以下规则适用:

  • 如果 S 是 UnicodeString,则 PChar(S) 将 S 转换为以 null 结尾的字符串;它返回一个指向 S 中第一个字符的指针。这种类型转换用于 Windows API。例如,如果 Str1 和 Str2 是 UnicodeString,您可以像这样调用 Win32 API MessageBox 函数:MessageBox(0, PChar(Str1), PChar(Str2), MB_OK);。如果 S 是 AnsiString,则使用 PAnsiChar(S)。
  • 您还可以使用 Pointer(S) 将字符串转换为无类型指针。但如果 S 为空,则类型转换返回 nil。
  • PChar(S) 总是返回一个指向内存块的指针;如果 S 为空,则返回指向 #0 的指针。
  • 当您将 UnicodeString 或 AnsiString 变量强制转换为指针时,指针将保持有效,直到为变量分配新值或超出范围。如果将任何其他字符串表达式转换为指针,则该指针仅在执行类型转换的语句内有效。
  • 当您将 UnicodeString 或 AnsiString 表达式转换为指针时,通常应将指针视为只读的。只有满足以下所有条件时,您才能安全地使用指针修改字符串:
    • 表达式转换是 UnicodeString 或 AnsiString 变量。
    • 字符串不为空。
    • 该字符串是唯一的 - 即,引用计数为 1。要保证字符串是唯一的,请调用 SetLength、SetString 或 UniqueString 过程。
    • 自进行类型转换以来,该字符串尚未被修改。
    • 修改的字符都在字符串中。注意不要在指针上使用超出范围的索引。

将 WideString 值与 PWideChar 值混合时适用相同的规则。

于 2013-02-12T15:51:08.840 回答