2013-02-12 20 views
8

我知道在Delphi中,一个空字符串(AnsiString或WideString)可以由一个零指针或一个指向实际空字符串的指针表示。PChar('')保证是#0(而不是零)的指针吗?

通过实验我已经证明,在德尔福XE2(具体编译器设置)PChar('') <> nil。但是这是有保证的,还是可能会在未来的版本中改变,或者依赖于某种编译器设置?

我有信心危机。如果有人能给我一个明确的答案,我会很感激。

回答

10

是的。从字符串文字转换为PChar的类型不会是空指针。从相同字符类型的字符串转换为PChar的字符也不会为空。 (String to PChar,AnsiString to PAnsiChar等)

然而,对PChar输入其他东西的类型可能为null。 (指针为PChar类型,AnsiString类型到PWideChar等)

文档涵盖这在字符串类型题目的Mixing Delphi Strings and Null-Terminated Strings部分:

您也能投射出的UnicodeString或AnsiString类型字符串作为 空值终止字符串。以下规则适用:

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

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

+0

谢谢。对我来说会忘记问这是记录在哪里? – 2013-02-12 15:57:32

+1

@IanGoldby它记录在文档中。我只是做了一个搜索。它在这里:http://docwiki.embarcadero.com/RADStudio/XE3/en/String_Types#Mixing_Delphi_Strings_and_Null-Terminated_Strings当然你也可以做到这一点? ;-) – 2013-02-12 16:00:19

+0

@DavidHeffernan我看着PChar。感谢您的链接。 – 2013-02-12 16:04:45