はい。文字列リテラルから PChar への型キャストが null ポインターになることはありません。同じ文字型の文字列から PChar への型キャストも null になりません。(文字列から PChar、AnsiString から PAnsiChar など)
ただし、PChar への他のものの型キャストは null の場合があります。(PChar へのポインタ、PWideChar への AnsiString など)
ドキュメントでは、文字列型トピックの「Delphi 文字列と Null で終わる文字列の混合」セクションでこれについて説明しています。
UnicodeString または AnsiString 文字列を null で終わる文字列としてキャストすることもできます。次の規則が適用されます。
- S が UnicodeString の場合、PChar(S) は S をヌル終了文字列としてキャストします。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 値を混在させる場合も、同じ規則が適用されます。