Pointers and Arrays

Pointers and Arrays का काफी नजदीकी सम्बंध है। हमने पिछले अध्‍यायों में देखा है कि Array के विभिन्न Elements को किस प्रकार से Access किया जा सकता है। चलिए, एक बार फिर से Array के Elements को Access करने के तरीके को थोडा Review कर लेते हैं।

	int intArray[5] = { 301, 540, 177, 552, 93 };  // array

	for(int j=0; j<5; j++)                     // for each element,
	   cout << “\t” << intArray[j];            // print value

इस Code Segment में cout Statement Array के सभी Elements के मान को Output में Print करता है। उदाहरण के लिए जब j का मान 4 होता है, तब Expression intArray[j] intArray[4] में मान को Output में Print करता है जो कि 93 है। इस Code Segment का Output हमें निम्नानुसार प्राप्त होता है:

        301         540         177         552         93

 Array के विभिन्न Elements को Pointer Notation द्वारा भी ठीक उसी तरह से Access किया जा सकता है जिस तरह से Array Notation द्वारा Access किया जाता है। इसे समझने के लिए निम्न Code Segment देखिए जो पिछले Code Segment के समान ही Output प्रदान करता है:

	int intArray[5] = { 31, 54, 77, 52, 93 };  // array

	for(int j=0; j<5; j++)                     // for each element,
	   cout << endl << *(intArray + j);          // print value

*(intArray + j ) Expression व intArray[j] Expression इन दोनों Expression का Output पर समान प्रभाव होता है। चलिए, इस Pointer Expression को समझने की कोशिश करते हैं।

मानलो कि j का मान 4 है इसलिए ये Expression *(intArray + 4 ) के समान होगा। हम इस Expression से Array के चौथे Element जिसका मान 93 है, को Represent करना चाहते हैं।

एक बात हमेंशा ध्‍यान रखें कि Array का नाम हमेंशा Array के Base Address को Represent करता है। इसलिए intArray + j Expression Required मान के Memory Location का एक Address ही होता है।

आप सोच सकते हैं कि intArray + 3 Expression intArray के Address में 3 जोडेगा। लेकिन ऐसा नहीं होता है।  चूंकि intArray एक Integer प्रकार का Array है और Pointer हमेंशा अपने Scale Factor के अनुसार बढता या घटता है। अब चूंकि एक Integer प्रकार का मान Memory में 32-Bit Compiler के लिए चार Byte का Space लेता है, तो चौथे Element को Access करने के लिए ये 4 * 4 = 16 Bytes Return करेगा।  यदि हम ये मानें कि intArray Memory में Memory Location 2000 से शुरू होता है, तो चौथे Element के मान व intArray के Address को Expression intArray + j में रखने पर हमें 2000 + 4 * 4 = 2016 प्राप्त होता है। ये Address 2016 ही Array के चौथे Element का Address हैं।

“C++” का Compiler जब Pointer की Arithmetical Calculation करता है, तब उसे पता होता है कि वह किस Data Type के Variable या Array के साथ प्रक्रिया कर रहा है। चूंकि हमारे Program के अनुसार हमने intArray को Integer प्रकार का Define किया है, इसलिए Compiler को पता है intArray एक Integer प्रकार का Array है।

अत: जब Compiler को intArray + 3 Expression प्राप्त होता है, तो वह इस Expression के चौथे Integer के Address पर Program Control को भेजता है, ना कि चौथे Byte पर। लेकिन चूंकि हम चौथे Integer Address पर Stored मान को Access करना चाहते हैं ना कि चौथे Address को, इसलिए हमने Indirection Operator * का प्रयोग Expression के कोष्‍ठक से पहले किया है। इसी वजह से हमें जिस प्रकार के Variable का Address किसी Pointer Variable में Store करना होता है, उसी प्रकार का Pointer Variable Declare करना पडता है। यानी हमें Compiler को ये बताना पडता है कि हम जो Pointer Variable Create कर रहे हैं, वह किसी Integer Variable को Point करेगा या Float Variable को, ताकि Compiler उचित Arithmetical Operation Perform करके Array के किसी Element को Access कर सके।

Compiler जब Integer प्रकार के Variable के साथ प्रक्रिया करता है, तो 16 Bit Compiler होने पर वह Index number को 2 से गुणा करता है और 32 Bit Compiler होने पर Index Number को 4 से गुणा करता है। इसी तरह से यदि double प्रकार का Array हो तो Index Number को 8 से गुणा करके Array कि किसी Element का उचित Address प्रदान करता है।

मानलो कि हम intArray में j का मान Add करने के बजाय हम intArray के सभी मानों को क्रम से प्राप्त करने के लिए Increment Operator का प्रयोग करें, तो क्या हम इसे *(intArray++) Expression द्वारा Array के विभिन्न Elements के मानों को प्राप्त कर सकते हैं। तो इस सवाल का जवाब ये है कि हम ऐसा नहीं कर सकते हैं। intArray एक Address है जिस पर हमारा Computer Array को Store करता है। Array तब तक उसी Memory Address पर Stored रहता है जब तक हमारा Program Terminate नहीं हो जाता।  इसलिए intArray एक Constant है और हम किसी Constant को Increment नहीं कर सकते हैं।

यानी यदि हम किसी Constant मान मानलो 6 को Increment करना चाहें तो 6++ नहीं कर सकते हैं, क्योंकि 6 एक Constant मान है। इसी तरह से हम किसी Array को भी Increment नहीं कर सकते हैं, क्योंकि Array भी एक Constant होता है। लेकिन हालांकि हम किसी Array के Address को Increment नहीं कर सकते हैं, लेकिन हम उस Pointer Variable को Increment कर सकते हैं जिसमें कोई Address होता है। इसे समझने के लिए निम्न Code Segment देखिए:

	int intArray[] = { 31, 54, 77, 52, 93 }; 	// array

	int* ptrInt;                             	// pointer to int
	ptrInt = intArray;                       	// points to intArray
	for(int j=0; j<5; j++)                   	// for each element,
	   cout << endl << *(ptrInt++);          	// print value

इस Code Segment में हमने एक Pointer to int ptrInt Define किया है और इसे Value के रूप में intArray का Address Assign किया है। अब हम निम्नानुसार Expression द्वारा Array के विभिन्न Elements के मान को Access कर सकते हैं:

*(ptrInt++)

 ptrInt में सबसे पहला Address Array के पहले Element का होता है, यानी इसे हम intArray[0] Statement के समान मान सकते हैं, जहां पर Array के पहले Element का मान है।  लेकिन चूंकि ptrInt एक Variable है ना कि एक Constant, इसलिए हम इसे Increment कर सकते हैं। जब ये Increment होता है तब ये intArray के दूसरे Element को Point करता है, जिसे हम intArray[1] से Represent कर सकते हैं। इस तरह से एक Loop द्वारा ptrInt को Increment करके हम intArray के विभिन्न Elements को Access कर सकते हैं। (Pointers and Arrays – LinuxConfig )

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