5।5 चरित्र प्वाइंटर और कार्य
एक स्ट्रिंग निरंतर,
"I am a string"
के रूप में लिखा पात्रों में से एक सरणी है। आंतरिक प्रतिनिधित्व में, सरणी को शून्य वर्ण '\0'
से समाप्त कर दिया जाता है ताकि प्रोग्राम अंत प्राप्त कर सकें। भंडारण की लंबाई डबल कोट्स के बीच वर्णों की संख्या से अधिक है।
शायद स्ट्रिंग स्थिरांक का सबसे आम घटना में
printf("hello, world\n");
जहां इस तरह एक चरित्र स्ट्रिंग एक कार्यक्रम में प्रकट होता है, उस तक पहुँच एक चरित्र सूचक के माध्यम से है के रूप में कार्य करने के लिए तर्क के रूप में है; printf
चरित्र सरणी की शुरुआत में एक सूचक प्राप्त करता है। यही है, एक सूचक द्वारा अपने पहले तत्व में एक स्ट्रिंग निरंतर उपयोग किया जाता है।
स्ट्रिंग स्थिरांक को कार्य तर्कों की आवश्यकता नहीं है। pmessage
char *pmessage;
तो बयान
pmessage = "now is the time";
pmessage
के चरित्र सरणी के लिए सूचक प्रदान करती है के रूप में घोषित किया जाता है। यह एक स्ट्रिंग प्रति नहीं है; केवल पॉइंटर्स शामिल हैं। सी एक इकाई के रूप में वर्णों की एक पूरी स्ट्रिंग को संसाधित करने के लिए किसी भी ऑपरेटरों को प्रदान नहीं करता है।
वहाँ इन परिभाषाओं के बीच एक महत्वपूर्ण अलग है:
char amessage[] = "now is the time"; /* an array */
char *pmessage = "now is the time"; /* a pointer */
amessage
एक सरणी, बस काफी बड़ा पात्रों के अनुक्रम और '\0'
कि यह initializes धारण करने के लिए है। सरणी के भीतर व्यक्तिगत वर्ण amessage
द्वारा बदला जा सकता है हमेशा एक ही भंडारण का संदर्भ लेंगे। दूसरी ओर, pmessage
एक सूचक है, जो स्ट्रिंग स्थिर को इंगित करने के लिए प्रारंभ किया गया है; पॉइंटर को बाद में कहीं और इंगित करने के लिए संशोधित किया जा सकता है, लेकिन यदि आप स्ट्रिंग सामग्री को संशोधित करने का प्रयास करते हैं तो परिणाम अपरिभाषित होता है।
+---+ +--------------------+
pmessage: | o-------->| now is the time \0 |
+---+ +--------------------+
+--------------------+
amessage: | now is the time \0 |
+--------------------+
हम मानक पुस्तकालय से अनुकूलित दो उपयोगी कार्यों के संस्करणों का अध्ययन करके संकेत दिए गए और सरणियों के अधिक पहलुओं उदाहरण देकर स्पष्ट करना होगा। पहला फ़ंक्शन strcpy(s,t)
है, जो स्ट्रिंग s
स्ट्रिंग t
की प्रतिलिपि बनाता है। s = t
कहने के लिए यह अच्छा होगा लेकिन यह सूचकों की प्रतिलिपि नहीं करता है, वर्णों की प्रतिलिपि बनाने के लिए, हमें एक लूप की आवश्यकता है। सरणी संस्करण पहला है:
/* strcpy: copy t to s; pointer version 1 */
void strcpy(char *s, char *t)
{
while((*s = *t) != '\0')
{
s ++;
t ++;
}
}
क्योंकि तर्क मान द्वारा पारित कर रहे हैं, strcpy
मापदंडों s
और t
किसी भी तरह से उपयोग कर सकते हैं:
/* strcpy: copy t to s; array subscript version */
void strcpy(char *s, char *t)
{
int i;
i = 0;
while((s[i] = t[i]) != '\0')
i ++;
}
इसके विपरीत के लिए, यहाँ संकेत के साथ strcpy
का एक संस्करण है यह प्रसन्न करता है। यहां वे आसानी से पॉइंटर्स प्रारंभ कर रहे हैं, जो एक समय में एक वर्ण के सरणी के साथ घुड़सवार होते हैं, '\0'
जो t
को s
पर कॉपी कर दिया गया है।
अभ्यास में, strcpy
लिखा नहीं जाएगा जैसा कि हमने इसे ऊपर दिखाया है। अनुभवी C प्रोग्रामर पसंद करेंगे
/* strcpy: copy t to s; pointer version 2 */
void strcpy(char *s, char *t)
{
while((*s++ = *t++) != '\0')
;
}
इस पाश की कसौटी पर भाग में s
और t
की वेतन वृद्धि ले जाता है। *t++
का मान वह वर्ण है जो t
t
से पहले इंगित किया गया था; इस वर्ण के बाद पोस्टफिक्स ++
t
नहीं बदलता है। इसी तरह, s
से पहले वर्ण को पुराने s
स्थिति में संग्रहीत किया जाता है। यह वर्ण लूप को नियंत्रित करने के लिए '\0'
के विरुद्ध तुलना की गई मान भी है। शुद्ध प्रभाव यह है कि t
से s
तक वर्णों की प्रतिलिपि बनाई गई है, '\0'
को समाप्त करने सहित।
अंतिम संक्षेप के रूप में, देखें कि '\0'
के विरुद्ध तुलना अनावश्यक है, क्योंकि प्रश्न केवल यह है कि अभिव्यक्ति शून्य है या नहीं। तो समारोह की संभावना के रूप में
/* strcpy: cope t to s; pointer version 3 */
void strcpy(char *s, char *t)
{
while(*s++ = *t++);
}
लिखा जाएगा हालांकि यह पहली नजर के रूप में गुप्त लग सकता है, सांकेतिक सुविधा काफी है, और मुहावरा, में महारत हासिल किया जाना चाहिए क्योंकि आप सी कार्यक्रमों में यदि बार-बार देखेंगे।
मानक पुस्तकालय में strcpy
(<string.h>
) लक्ष्य कार्य को इसके कार्य मान के रूप में लौटाता है।
पीएस: यदि आप इसे पढ़ने में आनंद लेते हैं, तो & आर की एक प्रति खरीदने पर विचार करें - यह महंगा नहीं है।
दे रहा है मेरा उत्तर नीचे देखें। यह जवाब गलत है। –