据我所知,在Delphi中,空字符串(AnsiString或WideString)可以用nil指针表示,也可以用指向实际空字符串的指针表示。
通过实验我已经在Delphi XE2(具有特定的编译器设置)中显示PChar('') <> nil
。但这是保证的,还是可能在将来的版本中更改,或者依赖于某些编译器设置?
我有信心危机。如果有人能给我一个明确的答案,我将不胜感激。
答案 0 :(得分:10)
是。从字符串文字到PChar的类型转换永远不会是空指针。从具有相同字符类型的字符串到PChar的类型转换也不会为空。 (字符串到PChar,AnsiString到PAnsiChar等)
其他东西到PChar的类型转换可能是null。 (指向PChar的指针,指向PWideChar的AnsiString等)
文档在字符串类型主题的Mixing Delphi Strings and Null-Terminated Strings部分介绍了这一点:
您还可以将UnicodeString或AnsiString字符串转换为 以null结尾的字符串。以下规则适用:
- 如果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)。
- 您还可以使用Pointer(S)将字符串转换为无类型指针。但如果S为空,则类型转换返回nil。
- PChar(S)总是返回一个指向内存块的指针;如果S为空,则返回指向#0的指针。
- 当您将UnicodeString或AnsiString变量强制转换为指针时,指针将保持有效,直到为变量分配新值为止 或超出范围。如果将任何其他字符串表达式转换为a 指针,指针只在语句中有效 执行类型转换。
- 将UnicodeString或AnsiString表达式强制转换为指针时,通常应将指针视为只读。您可以 安全地使用指针只在所有的时候修改字符串 满足以下条件:
- 表达式cast是UnicodeString或AnsiString变量。
- 字符串不为空。
- 字符串是唯一的 - 即引用计数为1。要保证字符串是唯一的,请调用SetLength,SetString或 UniqueString程序。
- 自进行类型转换以来,字符串未被修改。
- 修改的字符都在字符串中。注意不要在指针上使用超出范围的索引。
将WideString值与PWideChar混合时,适用相同的规则 值。