2013-02-12 51 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