2013-02-12 11 views
8

Tôi hiểu rằng trong Delphi, một chuỗi rỗng (AnsiString hoặc WideString) có thể được biểu diễn bằng một con trỏ nil, hoặc bằng một con trỏ tới một chuỗi rỗng thực tế.PChar ('') có được đảm bảo là con trỏ tới # 0 (không phải nil) không?

Bằng thử nghiệm tôi đã chỉ ra rằng trong Delphi XE2 (với cài đặt trình biên dịch cụ thể) PChar('') <> nil. Nhưng điều này có được đảm bảo, hoặc nó có thể thay đổi trong một phiên bản tương lai hay phụ thuộc vào một số thiết lập trình biên dịch không?

Tôi đang gặp khủng hoảng về sự tự tin. Nếu bất cứ ai có thể cho tôi một câu trả lời dứt khoát, tôi sẽ biết ơn.

Trả lời

10

Có. Loại phôi từ chuỗi chữ đến PChar sẽ không bao giờ là con trỏ null. Loại phôi từ các chuỗi cùng loại ký tự vào PChar cũng sẽ không rỗng. (Chuỗi tới PChar, AnsiString tới PAnsiChar, v.v.)

Loại phôi khác vào PChar có thể là rỗng. (Pointer để PChar, AnsiString để PWideChar, vv)

Các tài liệu bao gồm này trong phần Mixing Delphi Strings and Null-Terminated Strings của các loại Chuỗi chủ đề:

Bạn cũng có thể cast một UnicodeString hoặc AnsiString chuỗi như một null- chuỗi chấm dứt. Các quy tắc sau đây áp dụng:

  • Nếu S là một UnicodeString, PChar (S) giả định S là chuỗi bị vô hiệu; nó trả về một con trỏ tới ký tự đầu tiên trong S. Các phôi như vậy được sử dụng cho API Windows. Ví dụ, nếu Str1 và Str2 là UnicodeString, bạn có thể gọi hàm API MessageBox Win32 như này: MessageBox (0, PChar (Str1), PChar (Str2), MB_OK) ;. Sử dụng PAnsiChar (S) nếu S là AnsiString.
  • Bạn cũng có thể sử dụng Pointer (S) để truyền một chuỗi tới một con trỏ không được nhập. Nhưng nếu S trống, typecast trả về nil.
  • PChar (S) luôn trả về một con trỏ tới một khối bộ nhớ; nếu S rỗng, con trỏ tới # 0 được trả về.
  • Khi bạn truyền biến UnicodeString hoặc AnsiString sang con trỏ, con trỏ vẫn hợp lệ cho đến khi biến được chỉ định một giá trị mới hoặc nằm ngoài phạm vi. Nếu bạn truyền bất kỳ biểu thức chuỗi nào khác vào con trỏ , con trỏ chỉ hợp lệ trong câu lệnh trong đó việc nhập kiểu được thực hiện.
  • Khi bạn truyền một biểu thức UnicodeString hoặc AnsiString sang con trỏ, con trỏ thường sẽ được coi là chỉ đọc. Bạn có thể sử dụng con trỏ một cách an toàn để sửa đổi chuỗi chỉ khi tất cả các điều kiện sau đây được đáp ứng:
    • Cụm biểu hiện là biến UnicodeString hoặc AnsiString.
    • Chuỗi không trống.
    • Chuỗi là duy nhất - nghĩa là, có số tham chiếu là một. Để đảm bảo rằng chuỗi là duy nhất, hãy gọi các thủ tục SetLength, SetString hoặc UniqueString.
    • Chuỗi chưa được sửa đổi kể từ khi tạo mẫu.
    • Các ký tự được sửa đổi đều nằm trong chuỗi. Cẩn thận không sử dụng chỉ mục ngoài phạm vi trên con trỏ.

Các quy tắc tương tự áp dụng khi trộn giá trị WideString với PWideChar giá trị.

+0

Cảm ơn. Tôi sẽ vô ơn khi hỏi nơi tài liệu này được ghi chép? –

+1

@IanGoldby Nó được ghi lại trong tài liệu. Tôi vừa tìm kiếm. Nó ở đây: http://docwiki.embarcadero.com/RADStudio/XE3/en/String_Types#Mixing_Delphi_Strings_and_Null-Terminated_Strings Chắc chắn bạn cũng có thể làm điều này? ;-) –

+0

@DavidHeffernan Tôi nhìn theo PChar. Cảm ơn các liên kết. –