मेरी बहुत ही निजी राय है कि तीर के साथ तस्वीरें इस तरह से इशारा करती हैं या जो संकेत को समझने में कठिन बनाती हैं। यह उन्हें कुछ सार, रहस्यमय संस्थाओं की तरह लगता है। वो नहीं हैं।
आपके कंप्यूटर में सब कुछ की तरह, संकेत संख्या हैं । "पॉइंटर" नाम केवल कहने का एक फैंसी तरीका है "एक वैरिएबल जिसमें एक पता है"।
इसलिए, मुझे समझाएं कि कंप्यूटर वास्तव में कैसे काम करता है।
हमारे पास एक है int
, इसका नाम i
और मूल्य है 5. यह मेमोरी में संग्रहीत है। स्मृति में संग्रहीत सब कुछ की तरह, इसे एक पते की आवश्यकता होती है, या हम इसे खोजने में सक्षम नहीं होंगे। कहते हैं की सुविधा देता है i
पता 0x12345678 पर समाप्त होता है और उसके साथी j
ऊपर मूल्य के साथ 6 समाप्त होता है बस इसे बाद। एक 32-बिट CPU को मान लें जहां int 4 बाइट्स है और पॉइंटर्स 4 बाइट्स हैं, तो इसके बाद वैरिएबल को भौतिक मेमोरी में संग्रहीत किया जाता है:
Address Data Meaning
0x12345678 00 00 00 05 // The variable i
0x1234567C 00 00 00 06 // The variable j
अब हम इन चरों पर इशारा करना चाहते हैं। हम एक सूचक को int int* ip1
और एक को बनाते हैं int* ip2
। कंप्यूटर में सब कुछ की तरह, ये पॉइंटर वैरिएबल मेमोरी में भी कहीं आवंटित किए जाते हैं। मान लें कि वे स्मृति में अगले आसन्न पते पर, तुरंत बाद समाप्त होते हैं j
। हम पहले से आवंटित चर के पतों को समाहित करने के लिए संकेत निर्धारित करते हैं: ip1=&i;
("आई 1 के पते की प्रतिलिपि ip1 में") और ip2=&j
। लाइनों के बीच क्या होता है:
Address Data Meaning
0x12345680 12 34 56 78 // The variable ip1(equal to address of i)
0x12345684 12 34 56 7C // The variable ip2(equal to address of j)
तो हमें जो मिला वो था अभी तक कुछ 4 बाइट की मेमोरी वाले नंबर। कहीं भी कोई रहस्यमय या जादुई तीर नहीं है।
वास्तव में, बस एक मेमोरी डंप को देखकर, हम यह नहीं बता सकते हैं कि पता 0x12345680 में एक है int
या नहीं int*
। अंतर यह है कि हमारा कार्यक्रम इस पते पर संग्रहीत सामग्री का उपयोग कैसे करता है। (हमारे कार्यक्रम का कार्य वास्तव में केवल सीपीयू को यह बताना है कि इन नंबरों का क्या करना है।)
फिर हम अप्रत्यक्ष के एक और स्तर के साथ जोड़ते हैं int** ipp = &ip1;
। फिर, हमें बस स्मृति का एक हिस्सा मिलता है:
Address Data Meaning
0x12345688 12 34 56 80 // The variable ipp
पैटर्न परिचित लगता है। फिर भी एक नंबर वाले 4 बाइट्स का एक और हिस्सा।
अब, यदि हमारे पास उपरोक्त काल्पनिक छोटी रैम की मेमोरी डंप है, तो हम मैन्युअल रूप से जांच सकते हैं कि ये पॉइंटर्स कहां हैं। हम ipp
चर के पते पर क्या संग्रहीत है, इस पर झांकते हैं और सामग्री 0x12345680 पाते हैं। जो निश्चित रूप से पता है जहां ip1
संग्रहीत है। हम उस पते पर जा सकते हैं, वहां की सामग्रियों की जांच कर सकते हैं, और उस पते का पता i
लगा सकते हैं, और फिर अंत में हम उस पते पर जा सकते हैं और 5 नंबर का पता लगा सकते हैं।
इसलिए यदि हम ipp की सामग्री लेते हैं *ipp
, तो हम पॉइंटर चर का पता प्राप्त करेंगे ip1
। लिखकर *ipp=ip2
हम ip2 को ip1 में कॉपी करते हैं, यह इसके बराबर है ip1=ip2
। किसी भी स्थिति में हमें मिलेगा
Address Data Meaning
0x12345680 12 34 56 7C // The variable ip1
0x12345684 12 34 56 7C // The variable ip2
(ये उदाहरण एक बड़े एंडियन सीपीयू के लिए दिए गए थे)
ipp
इसे परिभाषित करते समय टाइप करें, ताकि आपका प्रश्न पूर्ण हो ;-)