int x जैसा एक सामान्य वेरिएबल एक वैल्यू स्टोर करता है, और प्रोग्राम उस वैल्यू को मेमोरी में कहीं रखता है। x नाम एक सुविधाजनक लेबल है जिसका इस्तेमाल करने की सुविधा कंपाइलर देता है, ताकि आप फिजिकल लोकेशन के बारे में सोचे बिना उस स्टोर की गई वैल्यू को पढ़ और लिख सकें।
वह लोकेशन अभी भी मायने रखती है क्योंकि CPU आखिरकार एड्रेस का इस्तेमाल करके ही लोड और स्टोर करता है। जब आप x = 5; लिखते हैं, तब भी कंपाइल किया गया कोड अंदरूनी तौर पर एक एड्रेस का इस्तेमाल करके उन बाइट्स को ढूंढता है जो x से संबंधित हैं और उन्हें ओवरराइट करता है।
मेमोरी के बारे में सोचने का एक उपयोगी तरीका इसे बाइट्स की एक लंबी ऐरे (array) के रूप में देखना है, जहाँ हर बाइट का एक इंडेक्स होता है जिसे एड्रेस कहते हैं। जब कंपाइलर x बनाता है, तो वह एड्रेस का एक ऐसा क्षेत्र चुनता है जो int को रखने के लिए काफी बड़ा हो, और फिर x नाम के हर इस्तेमाल को उस क्षेत्र से जोड़ देता है।
इस मॉडल के दो परिणाम निकलते हैं।
x की वैल्यू बदलते हैं, तो आप उसी एड्रेस रेंज पर बाइट्स को ओवरराइट करते हैं।y = x बनाते हैं, तो आमतौर पर आपको कॉपी की गई वैल्यू के साथ एक अलग एड्रेस रेंज मिलती है, इसलिए x में बाद में किए गए बदलावों का y पर कोई असर नहीं पड़ता।पॉइंटर एक ऐसा वेरिएबल है जिसकी वैल्यू एक एड्रेस होती है। यह खुद int को स्टोर नहीं करता, बल्कि यह स्टोर करता है कि int मेमोरी में कहाँ है, ताकि आप उस एड्रेस का पालन करके int तक पहुँच सकें।
C++ में, दो ऑपरेटर इसे स्पष्ट करते हैं।
&x // address-of, वह एड्रेस देता है जहाँ x स्टोर है
*p // dereference, p में मौजूद एड्रेस पर स्टोर वैल्यू तक पहुँचता है
मेमोरी बॉक्स और इस बात को समझें कि एड्रेस वही रहने पर भी वैल्यू कैसे बदल सकती है।
मुख्य नियम अगर
p,&xके बराबर है, तो*pउसी वैल्यू को दिखाता है जोxमें स्टोर है।
एक बार जब आप एड्रेस स्टोर कर लेते हैं, तो आप किसी ऑब्जेक्ट को कॉपी करने के बजाय उसका एक्सेस शेयर कर सकते हैं। यह कुछ आम स्थितियों में दिखता है।
nullptr हो सकता है जिसका मतलब है कि कोई ऑब्जेक्ट नहीं है; इससे टाइप में ही पता चल जाता है कि ऑब्जेक्ट मौजूद नहीं है।कॉपी करने और शेयर करने के तरीकों की तुलना करें और देखें कि म्यूटेशन और लागत में क्या फ़र्क है।