2013-02-12 12 views
8

मैं समझता हूं कि डेल्फी में, एक खाली स्ट्रिंग (AnsiString या WideString) को शून्य पॉइंटर द्वारा या एक वास्तविक खाली स्ट्रिंग पर पॉइंटर द्वारा प्रदर्शित किया जा सकता है।क्या पीसीहर ('') # 0 (शून्य नहीं) के सूचक होने की गारंटी है?

प्रयोग करके मैंने दिखाया है कि डेल्फी XE2 (विशेष कंपाइलर सेटिंग्स के साथ) PChar('') <> nil में। लेकिन क्या यह गारंटी है, या भविष्य में संस्करण में बदल सकता है, या कुछ कंपाइलर सेटिंग पर निर्भर हो सकता है?

मुझे आत्मविश्वास का संकट हो रहा है। अगर कोई मुझे एक निश्चित उत्तर दे सकता है तो मैं आभारी रहूंगा।

उत्तर

10

हां। स्ट्रिंग अक्षर से पीसीहर तक का प्रकार टाइप करें, कभी भी शून्य पॉइंटर्स नहीं होंगे। एक ही चरित्र प्रकार के तारों से पीसीहर तक का प्रकार शून्य हो जाएगा, या तो नहीं। (पीसीर के लिए स्ट्रिंग, AnsiString से पेंसिहर, आदि)

पीसीहर को अन्य चीजों का प्रकार शून्य हो सकता है, हालांकि।

तुम भी एक null- के रूप में एक UnicodeString या AnsiString स्ट्रिंग डाली कर सकते हैं: (सूचक PChar को, PWideChar को AnsiString, आदि)

प्रलेखन स्ट्रिंग प्रकार विषय की Mixing Delphi Strings and Null-Terminated Strings अनुभाग में इस को शामिल किया गया समाप्त स्ट्रिंग। निम्नलिखित नियम लागू होते हैं:

  • यदि एस यूनिकोडस्ट्रिंग है, तो पीसीहर (एस) एस को एक शून्य-समाप्त स्ट्रिंग के रूप में रखता है; यह एस में ऐसे पहले चरित्र को पॉइंटर देता है जैसे कि विंडोज एपीआई के लिए उपयोग किया जाता है। उदाहरण के लिए, यदि स्ट्र 1 और स्ट्र 2 यूनिकोडस्ट्रिंग हैं, तो आप Win32 API MessageBox फ़ंक्शन को जैसे कॉल कर सकते हैं: संदेशबॉक्स (0, पीसीहर (स्ट्र 1), पीसीहर (स्ट्र 2), एमबी_ओके); PAnsiChar (एस) का उपयोग करें यदि एस एक AnsiString है।
  • आप एक अनियंत्रित सूचक को स्ट्रिंग डालने के लिए पॉइंटर (एस) का भी उपयोग कर सकते हैं। लेकिन अगर एस खाली है, तो टाइपकास्ट शून्य लौटाता है।
  • पीसीहर (एस) हमेशा एक स्मृति ब्लॉक में एक सूचक देता है; यदि एस खाली है, तो # 0 का सूचक वापस लौटाया जाता है।
  • जब आप एक यूनिकोडस्ट्रिंग या AnsiString चर को एक पॉइंटर पर डालते हैं, तो पॉइंटर तब तक वैध रहता है जब तक वेरिएबल को नया मान असाइन नहीं किया जाता है या दायरे से बाहर नहीं जाता है। यदि आपने पॉइंटर पर कोई अन्य स्ट्रिंग अभिव्यक्ति डाली है, तो पॉइंटर केवल उस कथन के भीतर मान्य है जहां टाइपकास्ट किया जाता है।
  • जब आप एक पॉइंटर पर यूनिकोडस्ट्रिंग या AnsiString अभिव्यक्ति डालें, तो पॉइंटर को आमतौर पर केवल पढ़ने के लिए माना जाना चाहिए। आप सुरक्षित रूप से स्ट्रिंग को संशोधित करने के सूचक का उपयोग कर सकते है केवल जब निम्नलिखित शर्तें पूरी संतुष्ट हैं:
    • अभिव्यक्ति डाली एक UnicodeString या AnsiString चर रहा है।
    • स्ट्रिंग खाली नहीं है।
    • स्ट्रिंग अद्वितीय है - यानी, एक संदर्भ संदर्भ है। यह गारंटी देने के लिए कि स्ट्रिंग अद्वितीय है, SetLength, SetString, या अद्वितीय स्ट्रिंग प्रक्रियाओं को कॉल करें।
    • टाइपकास्ट किए जाने के बाद स्ट्रिंग को संशोधित नहीं किया गया है।
    • संशोधित वर्ण स्ट्रिंग के भीतर हैं। पॉइंटर पर आउट-ऑफ-रेंज इंडेक्स का उपयोग न करने के लिए सावधान रहें।

वही नियम लागू जब PWideChar मूल्यों के साथ WideString मूल्यों मिश्रण।

+0

धन्यवाद। यह पूछने के लिए मेरा आभारी होगा कि यह कहां दस्तावेज है? –

+1

@IanGoldby यह दस्तावेज़ीकरण में प्रलेखित है। मैंने अभी एक खोज की है। यह यहां है: http://docwiki.embarcadero.com/RADStudio/XE3/en/String_Types#Mixing_Delphi_Strings_and_Null-Terminated_Strings निश्चित रूप से आप यह भी कर सकते थे? ;-) –

+0

@ डेविड हेफरनन मैंने पीसीहर के नीचे देखा। लिंक के लिए धन्यवाद। –

संबंधित मुद्दे