C++ میں پوائنٹر ٹو پوائنٹر

C My Pwayn R W Pwayn R



یہ مضمون C++ میں پوائنٹر ٹو پوائنٹر تصور کے بارے میں ہے۔ پوائنٹر ٹو پوائنٹر پوائنٹر یا دوسرے پوائنٹر کا ایڈریس اسٹور کرتا ہے اور خود ہی پوائنٹرز کی ہیرا پھیری کو قابل بناتا ہے۔ اس تصور کو استعمال کرتے ہوئے، ہم میموری میں کسی دوسرے مقام سے پوائنٹر کو آسانی سے تبدیل کر سکتے ہیں۔ ایک صف کے عناصر کو جوڑتوڑ کرنے کے لیے متحرک طور پر مختص میموری یا کثیر جہتی صفوں میں ڈبل پوائنٹرز فائدہ مند ہیں۔ ہم مناسب مثالوں کے ساتھ اس پوائنٹر ٹو پوائنٹر کام کرنے اور C++ میں استعمال پر بات کریں گے۔

منظر نامہ 1: پوائنٹر ٹو پوائنٹر کی میموری کی نمائندگی

اس منظر نامے میں، ڈبل پوائنٹر کا اعلان پوائنٹر کے نام سے پہلے ایک اضافی نجمہ (*) کے ساتھ پوائنٹر کے اعلان کی طرح ہے۔ ہم آسانی سے C++ میں ڈبل پوائنٹر کی میموری لوکیشن کی نمائندگی کر سکتے ہیں۔ پوائنٹر ٹو پوائنٹر کا کوڈ کا ٹکڑا درج ذیل میں دیا گیا ہے۔







# شامل کریں
نام کی جگہ کا استعمال کرتے ہوئے std؛
اہم int ( )
{
int ہندسہ = پچاس ;
int * پی ٹی آر آر
ptrr = اور ہندسہ
int ** ptrr1؛
ptrr1 = اور پی ٹی آر آر
cout << 'پوائنٹر میموری ایڈریس ہے: \n ' ;
cout << 'ptrr (پوائنٹر):' << ptrr << ' \n ' ;
cout << '*ptrr1 (ڈبل پوائنٹر):' <<* ptrr1 << ' \n ' ;
cout << پوائنٹر میں ویلیو اسٹورز ہیں: \n ' ;
cout << '*ptrr =' <<* ptrr << endl
cout << '**ptrr1 (پوائنٹر سے پوائنٹر) = ' <<** ptrr1 << endl
واپسی 0 ;
}


مین فنکشن میں، ہم ایک متغیر لیتے ہیں جس کے میموری ایڈریس کو پوائنٹر میں اسٹور کرنے کی ضرورت ہوتی ہے۔ اب، ہم 'ڈیجٹ' متغیر کو شروع کرتے ہیں۔ اس کے بعد، ہم 'ptrr' پوائنٹر کا اعلان کرتے ہیں جو 'ڈیجٹ' میموری ایڈریس کو محفوظ کرتا ہے۔ اب، ہم ڈبل پوائنٹر کا اعلان کرتے ہیں جس کا نام '**ptrr1' ہے جو '*ptrr' پوائنٹر کا پتہ محفوظ کرتا ہے۔ کوڈ کے آخر میں، ہم کنسول اسکرین پر پوائنٹر اور ڈبل پوائنٹر کی میموری اور قدر ظاہر کرتے ہیں۔ اس کوڈ کے آؤٹ پٹ کا ذکر درج ذیل میں کیا گیا ہے۔




'ptrr' پوائنٹر کا میموری ایڈریس '0x6ffe04' ہے، اور '*ptrr1' پوائنٹر 'ptrr' پوائنٹر کا میموری ایڈریس بھی محفوظ کرتا ہے۔ پوائنٹر کے اندر ذخیرہ شدہ قدر '50' ہے۔ بنیادی طور پر، ڈبل پوائنٹر کا ایڈریس ہمیشہ پوائنٹر کے میموری ایڈریس جیسا ہی ہوتا ہے۔



منظر نامہ 2: پوائنٹر ٹو پوائنٹر بطور فنکشن پیرامیٹر

اس منظر نامے میں، ہم سیکھیں گے کہ کسی بھی فنکشن میں کسی بھی متغیر میں عارضی میموری مختص کرنے کے لیے پیرامیٹر کے طور پر ڈبل پوائنٹر کو کیسے پاس کرنا ہے۔ ڈبل پوائنٹر کے ساتھ فنکشن پیرامیٹر کے کوڈ کا ٹکڑا درج ذیل میں بتایا گیا ہے۔





# شامل کریں
getMemoryAddress کو باطل کریں۔ ( int ** double_ptr ) {
آپ کا موسم = 200 ;
* double_ptr = اور درجہ حرارت
}

اہم int ( ) {
int * ptr_1;
int ** double_ptr;
double_ptr = اور ptr_1;
getMemoryAddress ( double_ptr ) ;
std::cout << '**ڈبل_پی ٹی آر کی قدر ہے :' << ** double_ptr << std::endl;
واپسی 0 ;
}


یہاں، ہم سیکھیں گے کہ پوائنٹر ٹو پوائنٹر کا تصور C++ میں کیسے کام کرتا ہے۔ یاد رکھیں کہ پروگرام میں ایک پوائنٹر کو ڈبل پوائنٹر کے ساتھ کام کرنے کا اعلان کیا جاتا ہے۔ لہذا، ہم 'getMemoryAddress' فنکشن بناتے ہیں۔ ہم اس فنکشن کو اس طرح ڈیزائن کرتے ہیں کہ جب ہم پیرامیٹر کو پاس کرتے ہیں تو اسے خود بخود ڈبل پوائنٹر کا میموری ایڈریس مل جاتا ہے۔

فنکشن میں، ہم 'tempp' متغیر اور '**double_ptr' ڈبل پوائنٹر لیتے ہیں۔ ہم مخصوص متغیر کا ایڈریس پاس کرتے ہیں جو کہ 'tempp' ہے ڈبل پوائنٹر اور ڈبل پوائنٹر ویلیوز کو فنکشن کی دلیل کے طور پر۔ پروگرام کنسول اسکرین پر مین فنکشن کوڈ کا نتیجہ دکھاتا ہے، اس لیے وہ تمام چیزیں جو مین فنکشن میں ہیں قابل عمل ہیں۔ ہم مین فنکشن میں 'ptr_1' پوائنٹر اور ڈبل پوائنٹر کو 'double_ptr' کے طور پر لیتے ہیں۔ ہم پوائنٹر کا ایڈریس ڈبل پوائنٹر کو دیتے ہیں۔



اب، ہم اوور رائڈ فنکشن میں ڈبل پوائنٹر متغیر کو پاس کرتے ہیں اور ڈبل پوائنٹر کا نتیجہ ظاہر کرنے کے لیے 'cout' آؤٹ پٹ اسٹریم اسٹیٹمنٹ میں پوائنٹر کو پوائنٹر ویری ایبل میں منتقل کرتے ہیں۔

جب کمپائلر اوور رائڈ فنکشن تک پہنچ جاتا ہے، تو کمپائلر چیکر جہاں اس فنکشن کی تعریف کی گئی ہے فنکشن کے اندر کوڈ کو ایکسیکیوٹ کرتا ہے اور نتیجہ کو مین فنکشن میں واپس کرتا ہے۔

اس کوڈ کا آؤٹ پٹ درج ذیل میں منسلک ہے:


نتیجہ: ڈبل پوائنٹر کی قدر 200 ہے۔

منظر نامہ 3: پوائنٹر ٹو پوائنٹر کے ساتھ 2D ارے کا استعمال

اس مثال میں، ہم ایک 2D صف سے نمٹیں گے جس میں ڈبل پوائنٹر ہے۔ ہم ایک صف لیتے ہیں اور پوائنٹر میں ایک صف کا پتہ پاس کرتے ہیں۔ اس منظر نامے کا مکمل کوڈ درج ذیل ہے:

اہم int ( ) {
const int rows = 3 ;
const int cols = 2 ;
int ** میٹرکس = نیا انٹ * [ قطاریں ] ;
کے لیے ( int i = 0 ; میں < قطاریں ++i ) {
میٹرکس [ میں ] = نیا int [ کالز ] ;
}
کے لیے ( int i = 0 ; میں < قطاریں ++i ) {
کے لیے ( int j = 0 ; جے < کالز ++j ) {
میٹرکس [ میں ] [ جے ] = میں * cols + j;
}
}
کے لیے ( int i = 0 ; میں < قطاریں ++i ) {
کے لیے ( int j = 0 ; جے < کالز ++j ) {
cout << میٹرکس [ میں ] [ جے ] << ' ;
}
cout << endl
}
کے لیے ( int i = 0 ; میں < قطاریں ++i ) {
حذف کریں [ ] میٹرکس [ میں ] ;
}
حذف کریں [ ] میٹرکس؛
واپسی 0 ;
}


جیسا کہ ہم سب جانتے ہیں، ہمارے پاس 2D صف میں کئی قطاریں اور کئی کالم ہیں۔ مین فنکشن میں، ہم ان قطاروں اور کالموں کو شروع کرتے ہیں جن میں 'const int' ہوتا ہے۔ اس کے بعد، ہم قطاروں کے لیے میموری کی جگہ اور ہر قطار کے ساتھ کالم کے لیے میموری کی جگہ مختص کرتے ہیں۔ ہم میٹرکس ڈبل پوائنٹر میں پوائنٹر کے طور پر قطاروں کی تعداد کو '** میٹرکس' کے طور پر پاس کرتے ہیں۔ اس ڈبل پوائنٹر میں، قطاروں کی تعداد کا لوپ عمل میں آتا ہے یا درست۔ پھر، ایک اور اندرونی لوپ کو اس وقت تک عمل میں لایا جاتا ہے جب تک کہ حالت غلط نہ ہو جائے۔

میموری مختص کرنے کے بعد، ہم ایک صف میں دوبارہ ایک قدر تفویض کرتے ہیں: قطاروں کے لیے ایک بیرونی لوپ اور 2D صف کے کالموں کے لیے ایک اندرونی لوپ۔ اندرونی لوپ میں، قطاروں اور کالموں کی قدر ڈبل پوائنٹر کو تفویض کی جاتی ہے اور ایک مطلوبہ ریاضی کا عمل انجام دیتی ہے۔ ہم 2D صف کی قدروں کو ظاہر کرتے ہیں جیسے قطاروں اور کالموں کی تعداد جو میموری میں مختص کی گئی ہیں۔ قطاروں اور کالموں کی تعداد ہمیشہ ڈبل پوائنٹر کی طرف اشارہ کرتی ہے جو قطاروں اور کالم کی قدروں کو ذخیرہ کرتا ہے۔ آخر میں، ہم میموری کو صاف کرتے ہیں اور C++ میں میموری سے اس صف کو ڈیلوکیٹ کرتے ہیں۔

ڈبل پوائنٹر کے ساتھ 2D صف کا آؤٹ پٹ درج ذیل میں منسلک ہے:

منظر نامہ 4: پوائنٹر ٹو پوائنٹر کا استعمال کرتے ہوئے پوائنٹرز کو تبدیل کرنا

یہاں، ہم سیکھیں گے کہ ڈبل پوائنٹر کا اعلان کرکے C++ میں پوائنٹرز کو کیسے تبدیل کیا جائے۔ اس منظر نامے کا کوڈ کا ٹکڑا درج ذیل میں منسلک ہے:

# شامل کریں
باطل تبادلہ ( int ** ptrr_1، آپ ** ptrr_2 ) {
int * temp_var = * ptrr_1;
* ptrr_1 = * ptrr_2;
* ptrr_2 = temp_var;
}
اہم int ( ) {
int x = پندرہ , y = 25 ;
int * ptrrA = اور ایکس، * ptrrB = اور اور
std::cout << 'تبادلے سے پہلے: *ptrrA is = ' << * ptrrA << '، *ptrrB ہے = ' << * ptrrB << std::endl;
تبادلہ ( اور ptrrA، اور ptrrB ) ;
std::cout << 'تبادلہ کے بعد: *ptrrA ہے = ' << * ptrrA << '، *ptrrB ہے = ' << * ptrrB << std::endl;
واپسی 0 ;
}


سب سے پہلے، ہم سویپ فنکشن بناتے ہیں، دونوں پوائنٹرز کو فنکشن آرگومنٹ کے طور پر پاس کرتے ہیں۔ سویپ فنکشن میں، ہم 'temp' پوائنٹر لیتے ہیں اور کچھ وقت کے لیے 'temp' میں 'pointer1' کی ویلیو پاس کرتے ہیں۔ پھر، ہم 'پوائنٹر 2' کی قدر کو 'پوائنٹر 1' میں منتقل کرتے ہیں۔ آخر میں، ہم 'ٹمپ' پوائنٹر کی قدر کو 'پوائنٹر 2' پر منتقل کرتے ہیں۔

مین فنکشن میں، ہمیں دو پوائنٹرز کی ضرورت ہوتی ہے جنہیں ہم 'swap' فنکشن میں پاس یا اوور رائڈ کرتے ہیں۔ ہم متغیرات کے ایڈریس کو دیے گئے پوائنٹرز پر منتقل کرتے ہیں۔ پھر، پوائنٹر کو تبدیل کرنے سے پہلے اور بعد میں پوائنٹر کی قدر ظاہر ہوتی ہے۔

اس کوڈ کا آؤٹ پٹ درج ذیل میں منسلک ہے:


جیسا کہ ہم دیکھ سکتے ہیں، پوائنٹر کی قدروں کو C++ میں ڈبل پوائنٹر کا استعمال کرتے ہوئے کامیابی سے تبدیل کیا جاتا ہے۔

نتیجہ

ہم نے یہ نتیجہ اخذ کیا کہ پوائنٹر ٹو پوائنٹر ہمیشہ کسی بھی پوائنٹر کا میموری ایڈریس C++ میں محفوظ کرتا ہے۔ ہم کسی بھی وقت کسی بھی پوائنٹر کی میموری لوکیشن کو عارضی طور پر استعمال کرنے کے لیے ڈبل پوائنٹر استعمال کر سکتے ہیں۔ یہ میموری ایڈریس کو بالواسطہ طور پر ہیرا پھیری کرنے اور ڈیٹا تک پہنچنے کا ایک بہت مؤثر طریقہ ہے۔