ایک عام ویری ایبل (جیسے int x) ایک ویلیو کو محفوظ کرتا ہے، اور پروگرام اس ویلیو کو میموری میں کسی جگہ پر رکھتا ہے۔ نام x ایک آسان لیبل ہے جسے کمپائلر استعمال کرنے کی اجازت دیتا ہے، تاکہ آپ اس محفوظ شدہ ویلیو کو پڑھ اور لکھ سکیں اور آپ کو اس کی طبعی جگہ (physical location) کے بارے میں سوچنے کی ضرورت نہ پڑے۔
وہ جگہ (مقام) پھر بھی اہم ہے کیونکہ CPU بالآخر ایڈریسز (addresses) کا استعمال کرتے ہوئے ڈیٹا لوڈ اور اسٹور کرتا ہے۔ یہاں تک کہ جب آپ x = 5; لکھتے ہیں، تو کمپائلڈ کوڈ پسِ پردہ ایک ایڈریس استعمال کرتا ہے تاکہ x سے متعلقہ بائٹس (bytes) کو تلاش کر کے ان پر نئی ویلیو لکھ سکے (overwrite کر سکے)۔
میموری کے بارے میں سوچنے کا ایک مفید طریقہ اسے بائٹس کی ایک طویل قطار (array) کے طور پر دیکھنا ہے، جہاں ہر بائٹ کا ایک انڈیکس ہوتا ہے جسے ‘ایڈریس’ کہا جاتا ہے۔ جب کمپائلر x کو تخلیق کرتا ہے، تو وہ ایڈریسز کا ایک ایسا حصہ (region) منتخب کرتا ہے جو int کو رکھنے کے لیے کافی بڑا ہو، اور پھر x نام کے ہر استعمال کو اسی حصے سے منسوب کر دیتا ہے۔
اس ماڈل کے دو نتائج برآمد ہوتے ہیں۔
x کی ویلیو تبدیل کرتے ہیں، تو آپ اسی ایڈریس رینج پر موجود بائٹس کو اوور رائٹ (overwrite) کرتے ہیں۔y = x بناتے ہیں، تو عام طور پر آپ کو کاپی شدہ ویلیو کے ساتھ ایک الگ ایڈریس رینج ملتی ہے، لہذا x میں بعد میں کی جانے والی تبدیلیاں y پر اثر انداز نہیں ہوتیں۔پوائنٹر ایک ایسا ویری ایبل ہے جس کی ویلیو خود ایک ایڈریس ہوتی ہے۔ یہ int کو خود محفوظ نہیں کرتا، بلکہ یہ محفوظ کرتا ہے کہ int میموری میں کہاں موجود ہے، تاکہ آپ اس ایڈریس کی پیروی کرتے ہوئے int تک رسائی حاصل کر سکیں۔
C++ میں، دو آپریٹرز اس تصور کو عملی شکل دیتے ہیں۔
&x // address-of، یہ وہ ایڈریس فراہم کرتا ہے جہاں x محفوظ ہے
*p // dereference، یہ p میں موجود ایڈریس پر محفوظ ویلیو تک رسائی دیتا ہے
میموری کے خانوں (boxes) اور اس عمل کو سمجھیں کہ کس طرح ایڈریس وہی رہتے ہوئے ویلیو تبدیل ہو سکتی ہے۔
کلیدی مستقل (Key invariant) اگر
pکی قیمت&xکے برابر ہو، تو*pاسی ذخیرہ شدہ قدر (stored value) کی طرف اشارہ کرتا ہے جس کی طرفxکرتا ہے۔
ایک بار جب آپ کسی ایڈریس کو محفوظ کر لیتے ہیں، تو آپ کسی آبجیکٹ (object) کی نقل (copy) بنانے کے بجائے اس تک مشترکہ رسائی حاصل کر سکتے ہیں۔ اس کا اطلاق چند عام صورتحال میں ہوتا ہے۔
nullptr ہو سکتی ہے جس کا مطلب ہے کہ کوئی آبجیکٹ موجود نہیں؛ اس طرح ڈیٹا کی عدم موجودگی ‘ٹائپ’ (type) میں واضح ہو جاتی ہے۔‘نقل بنانے’ (copy) اور ‘اشتراک کرنے’ (share) کے منظرناموں کا موازنہ کریں اور دیکھیں کہ تبدیلی (mutation) اور لاگت (cost) میں کیا فرق ہے۔