Pointers and Strings

Pointers and Strings: Strings Char प्रकार का एक One Dimensional Array होता है। इसलिए Pointer Notation को Array पर भी समान प्रकार से Apply किया जा सकता है। चलिए, हम एक उदाहरण द्वारा String Array पर Pointer Notation को Apply करते हैं।

	   char str1[] = “Defined as an array";
	   char* str2 = “Defined as a pointer";

	   cout << endl << str1;      		// display both strings
	   cout << endl << str2;

	// str1++;                    		// can't do this; str1 is a constant
	   str2++;                    		// this is OK, str2 is a pointer

	   cout << endl << str2;      		// now str2 starts “efined...”

इस Code Segment में दिए गए String Constants समान हैं। हम इन दोनों Strings को Print कर सकते हैं, जैसाकि उदाहरण में दर्शाया गया है। लेकिन इन दोनों में एक मुख्‍य अन्तर ये है कि str1 एक Address है यानी एक Pointer Constant है जबकि str2 एक Pointer Variable है।  इसलिए str2 को Change किया जा सकता है जबकि str1 को Change नहीं किया जा सकता है। हम str2 को Increment कर सकते हैं क्योंकि ये एक Pointer है, लेकिन जब हम इसे एक बार Increment करते हैं, तो String का पहला Character Loss हो जाता है। यानी यदि हम str2 को Increment करके उसे Print करें तो हमें निम्नानुसार Output प्राप्त होता है:

efined as a pointer                                                  <– After str2++

 ऐसा इसलिए होता है, क्योंकि str2 को Increment करने से पहले इसमें String के पहले Character का Address होता है जबकि Increment करने के बाद इसमें str2 के दूसरे Character का Address आ जाता है और पहला Character Damage हो जाता है। यदि हम इसे और Increment करें, तो एक-एक करके सारे Characters Loss हो जाते हैं।  एक String को जब Pointer की तरह Define किया जाता है, तब हम इस String को अधिक Flexible तरीके से Access कर सकते हैं। इसे समझने के लिए हम एक Program देखते हैं, जिसमें String को एक Function में Argument की तरह Pass किया जा रहा है। ये Function displayString() केवल इस String को main() Function से Character By Character Access करके Display करने का काम कर रहा है।

	void main()
	{
		void displayString(char*);       	// prototype
		char str[] = “Idle people have the least leisure.";
		displayString(str);              	// display the string
	}

	void displayString(char* pointerString)
	{
		cout << endl;              	// start on new line
		while( * pointerString )        // until null character,
			cout << * pointerString ++;   // print character
	}

इस Code Segment में Array के Address str को एक Argument के रूप में Function displayString() में Pass किया गया है। ये Address एक Constant है लेकिन displayString() Function में Pass By Value भेजा गया है इसलिए Function को इस Array की एक Copy प्राप्त होती है। ये Copy एक Pointer pointerString को प्राप्त होता है।

एक Pointer को Change किया जा सकता है, इसलिए String के हर Character को Display करने के लिए pointerString को Increment किया गया है। *pointerString हर Successive Character को Return करता है। Loop तब तक चलता है, जब तक कि String के अन्त का (‘\0’) null Character Loop को प्राप्त नहीं हो जाता।

चूंकि इस Character का मान 0 होता है, जो कि false को Represent करता है, इसलिए while Loop terminate हो जाता है। इस प्रकार से Strings का प्रयोग करके हम बेवजह Reserve होने वाले Space को बचा सकते हैं। Pointers का प्रयोग करके हम Strings को Copy भी कर सकते हैं। साथ ही Pointers द्वारा हम किसी String में Characters को भी Insert कर सकते हैं। निम्न Code Fragment एक String को Pointer के प्रयोग द्वारा दूसरी String में Copy कर रहा है।

	void main()
	{
		void copyStr(char*, char*);    	// prototype

		char* str1 = “Self-conquest is the greatest victory.";
		char str2[80];                 	// empty string

		copyStr(str2, str1);           	// copy str1 to str2
		cout << endl << str2;          	// display str2
	}

	void copyStr(char* dest, char* src)
	{
		while( *src )                  	// until null character,
			*dest++ = *src++;           // copy chars from src to dest
		*dest = '\0';                  	// terminate dest
	}

इस Code Segment में main() Function copyStr() Function को str1 की String को str2 में Copy करने के लिए Call करता है। इस Function में

*dest++ = *src++;

Statement का प्रयोग किया गया है जो कि Source src पर Pointed Address पर स्थित Character को dest Pointed Address पर Store कर देता है। फिर दोनों Pointers Increment होते हैं और अगले Character को Source से Destination String में Copy किया जाता है। इस Program का भी Loop तब Terminate होता है, जब Loop को Null Character प्राप्त होता है।

हमने यहां जो Code Fragment लिखा है ये Code Fragment ठीक उसी प्रकार से काम करता है जिस प्रकार से Library Function strcpy() करता है। strcpy() Library Function का यदि Prototype देखा जाए, तो ये Prototype निम्नानुसार होता है:

char* strcpy(char* dest, const char* src);

 ये Function Argument के रूप में दो char* प्रकार के Argument लेता है। यहां const का प्रयोग इसलिए किया गया है, ताकि Pointer src द्वारा Pointer किसी भी Character को Modify ना कर सके। ये Function एक char* प्रकार का Pointer भी Return करता है। जिस तरह से int या float प्रकार के मानों का एक Array हो सकता है उसी तरह से Pointers का भी एक Array Create किया जा सकता है।

हमने पिछले एक अध्‍याय में देखा था कि यदि हमें कई लोगों के नाम Array के रूप में Computer में Store करने हों,  तो हमें 2-D Array की जरूरत पडती है।  लेकिन इनकी कमी ये है कि इन सभी Arrays की Size समान होती है, इसलिए कुछ Memory Space बेवजह Reserve हो जाता है, जिसका पूरे Program में कोई उपयोग नहीं हो पाता है। उदाहरण के लिए निम्न 2-D Array देखिए:

Pointers and Strings

हमनें नामों को Memory में Store करने के लिए एक 2-D Array का प्रयोग किया है। लेकिन हम देख सकते हैं कि इस 2-D Array में काफी Space बेवजह Reserved है। यदि हम Pointers का प्रयोग करें, तो इस प्रकार से Waste होने वाली Memory को बचा सकते हैं। इसके लिए हम निम्नानुसार Pointer का प्रयोग कर सकते हैं:

	char* arrayPtrs[DAYS] = { 
		“Sunday”, 
		“Monday”, 
		“Tuesday”, 
		“Wednesday”, 
		“Thursday”,
		“Friday”, 
		“Saturday”  
	};

	for(int j=0; j<DAYS; j++)    // display every string
		cout << arrayPtrs[j] << endl;

इस Code Segment से हमें निम्नानुसार Output प्राप्त होता है:

Sunday
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday

जब Strings किसी Array का हिस्सा नहीं होते हैं, तब Compiler उन्हें Continuous Memory Locations पर Store करता है, इसलिए Memory Waste नहीं होती है। लेकिन फिर भी हमें एक ऐसे char* प्रकार के Array की जरूरत होती है जो इन Strings के Pointers को Hold कर सके। इसीलिए इस Code Segment में हमने Array को Pointers to Array प्रकार का Define किया है।

जैसाकि हमने पहले भी कहा कि Array या String हमेंशा एक Single Address से Represent किए जाते हैं और ये Address String के पहले Character या Array के पहले Element का Address होता है। इन्हीं Addresses को इस char* प्रकार के Pointers के Array में Store किया जाता है। (Pointers and Strings)

CPP Programming Language in Hindiये Article इस वेबसाईट पर Selling हेतु उपलब्‍ध EBook C++ Programming Language in Hindi से लिया गया है। इसलिए यदि ये Article आपके लिए उपयोगी रहा, तो निश्चित रूप से ये पुस्तक भी आपके लिए काफी उपयोगी साबित होगी। 

C++ Programming Language in Hindi | Page: 666 | Format: PDF

BUY NOW GET DEMO REVIEWS