सी डबल पॉईंटर (पॉईंटर टू पॉईंटर)

आम्हाला माहित आहे की, पॉईंटरचा वापर सी मध्ये व्हेरिएबलचा पत्ता संचयित करण्यासाठी केला जातो पॉईंटर व्हेरिएबलचा प्रवेश वेळ कमी करतो. तथापि, सी मध्ये, आम्ही दुसर्‍या पॉईंटरचा पत्ता संचयित करण्यासाठी पॉईंटर देखील परिभाषित करू शकतो. अशा पॉईंटरला डबल पॉईंटर (पॉईंटर ते पॉईंटर) म्हणून ओळखले जाते. पहिला पॉईंटर व्हेरिएबलचा पत्ता संचयित करण्यासाठी वापरला जातो तर दुसर्‍या पॉईंटरचा वापर पहिल्या पॉईंटरचा पत्ता संचयित करण्यासाठी केला जातो. खाली दिलेल्या आकृत्याद्वारे हे समजूया.

डबल पॉईंटर घोषित करण्याचा वाक्यरचना खाली दिली आहे.

paunaZ **pai; // paEZMTr Tu A paEZMTr kaya Aahe paEMTiMga Tu Pk paunaZaMk.

खालील उदाहरणाचा विचार करा.

उदाहरण

#vaapara<PsaTidiAayaAae.Pca>
qaalai mauqya ()
{
paunaZ A = 10;
paunaZ *pai;
paunaZ **paipai;
pai = &A; // paEZMTr pai Aahe paEMTiMga Tu D paaa cyaa A
paipai = &pai; // paEZMTr paipai Aahe A AMk paEZMTr paEMTiMga Tu D paaa cyaa paEZMTr pai
laiha("paaa cyaa a: %\n",pai); // paaa cyaa A vaila baiEZ mauita
laiha("paaa cyaa p: %\n",paipai); // paaa cyaa pai vaila baiEZ mauita
laiha("maulya saMgazhita var p: %paunaZ\n",*pai); // maulya sTTRkelaelae var D paaa samaavaiST vDara pai mai.EZ. 10 vaila baiEZ mauita
laiha("maulya saMgazhita var paipai: %paunaZ\n",**paipai); // maulya saMgazhita var D paaa samaavaiST vDara D paEZMTr sTyad var paipai
}

आउटपुट

paaa cyaa A: k26M8734
paaa cyaa pai: k26M8738
maulya saMgazhita var pai: 10
maulya saMgazhita var paipai: 10

सी डबल पॉईंटर उदाहरण

चला एक उदाहरण पाहूया जेथे एक पॉईंटर दुसर्‍या पॉईंटरच्या पत्त्याकडे निर्देश करतो.

आपण वरील आकृतीमध्ये पाहू शकता की, पी 2 मध्ये पी (एफएफएफ 2) चा पत्ता आहे आणि पीमध्ये नंबर व्हेरिएबलचा पत्ता (एफएफएफ 4) आहे.

उदाहरण

#vaapara<PsaTidiAayaAae.Pca>
paunaZ mauqya(){
paunaZ kzmaaMk=50;
paunaZ *pai;//paEZMTr Tu paunaZ
paunaZ **paiR2;//paEZMTr Tu paEZMTr
pai=&kzmaaMk;//sTaeAr D paaa cyaa kzmaaMk cala
paiR2=&pai;
laiha("paaa cyaa kzmaaMk cala Aahe % \n",&kzmaaMk);
laiha("paaa cyaa p cala Aahe % \n",pai);
laiha("maulya cyaa *p cala Aahe %paunaZ \n",*pai);
laiha("paaa cyaa pai 2 cala Aahe % \n",paiR2);
laiha("maulya cyaa **pai 2 cala Aahe %paunaZ \n",*pai);
vaapasakra 0;
}

आउटपुट

paaa cyaa kzmaaMk cala Aahe PpafPpafPpafR4
paaa cyaa pai cala Aahe PpafPpafPpafR4
maulya cyaa *pai cala Aahe 50
paaa cyaa paiR2 cala Aahe PpafPpafPpafR2
maulya cyaa **pai cala Aahe 50

प्र. खालील प्रोग्रामचे आउटपुट काय असेल?

उदाहरण

#vaapara<PsaTidiAayaAae.Pca>
qaalai mauqya ()
{
paunaZ A[10] = {100, 206, 300, 409, 509, 601}; //AaeQ 1
paunaZ *pai[] = {A, A+1, A+2, A+3, A+4, A+5}; //AaeQ 2
paunaZ **paipai = pai; //AaeQ 3
paipai++; // AaeQ 4
laiha("%paunaZ %paunaZ %paunaZ\n",paipai-pai,*paipai - A,**paipai); // AaeQ 5
*paipai++; // AaeQ 6
laiha("%paunaZ %paunaZ %paunaZ\n",paipai-pai,*paipai - A,**paipai); // AaeQ 7
++*paipai; // AaeQ 8
laiha("%paunaZ %paunaZ %paunaZ\n",paipai-pai,*paipai - A,**paipai); // AaeQ 9
++**paipai; // AaeQ 10
laiha("%paunaZ %paunaZ %paunaZ\n",paipai-pai,*paipai - A,**paipai); // AaeQ 11
}

आउटपुट

1 1 206
2 2 300
2 3 409
2 3 410

वरील प्रश्नामध्ये, पॉईंटर अंकगणित डबल पॉईंटरसह वापरले जाते. 6 घटकांचा अ‍ॅरे परिभाषित केला आहे जो पॉईंटर पी च्या अ‍ॅरेद्वारे निर्देशित केला आहे. पॉईंटर अ‍ॅरे पी डबल पॉईंटर पीपीद्वारे निर्देशित केले आहे. तथापि, वरील प्रतिमा आपल्याला अ‍ॅरे ए आणि पॉईंटर अ‍ॅरे पीला मेमरी कशी वाटप केली जात आहे याबद्दल एक संक्षिप्त कल्पना देते. पीचे घटक असे पॉईंटर्स आहेत जे अ‍ॅरेच्या प्रत्येक घटकाकडे लक्ष वेधतात. आम्हाला माहित आहे की अ‍ॅरे नावात अ‍ॅरेचा बेस पत्ता आहे, तो पॉईंटर म्हणून कार्य करेल आणि प्रतिमेमध्ये दर्शविल्याप्रमाणे, *(ए), *(ए+1) इत्यादी वापरून मूल्य मागे टाकले जाऊ शकते, ए [0] खालील प्रकारे प्रवेश केला जाऊ शकतो. ए [०]: अ‍ॅरेच्या पहिल्या घटकामध्ये प्रवेश करण्याचा हा सर्वात सोपा मार्ग आहे *(अ): अ‍ॅरेच्या पहिल्या घटकाचा पत्ता स्टोअर केल्यापासून, आम्ही त्यावर इंडिरेक्शन पॉईंटर वापरुन त्याचे मूल्य प्रवेश करू शकतो. *पी [०]: जर ए [०] मध्ये पॉईंटर पी वापरुन प्रवेश केला गेला असेल तर आम्ही पॉईंटर अ‍ॅरे पी, म्हणजेच, *पी [०] च्या पहिल्या घटकावर इंडिरेक्शन ऑपरेटर ( *) वापरू शकतो. ** (पीपी): पीपी पॉईंटर अ‍ॅरेचा बेस पत्ता साठवताना, *पीपी पॉईंटर अ‍ॅरेच्या पहिल्या घटकाचे मूल्य देईल जे पूर्णांक अ‍ॅरेच्या पहिल्या घटकाचा पत्ता आहे. ** पी पूर्णांक अ‍ॅरेच्या पहिल्या घटकाचे वास्तविक मूल्य देईल. प्रोग्राममध्ये येत असताना, ओळ 1 आणि 2 पूर्णांक आणि पॉईंटर अ‍ॅरे तुलनेने घोषित करतात. लाइन 3 पॉईंटर अ‍ॅरे पी वर दुहेरी पॉईंटर प्रारंभ करते. प्रतिमेमध्ये दर्शविल्याप्रमाणे, जर अ‍ॅरेचा पत्ता 200 पासून सुरू झाला आणि पूर्णांकाचा आकार 2 असेल तर पॉईंटर अ‍ॅरेमध्ये 200, 202, 204, 206, 208, 210 अशी मूल्ये असतील. पॉईंटर अ‍ॅरेचा आधार पत्ता 300 आहे याचा विचार करूया; डबल पॉईंटर पीपीमध्ये पॉईंटर अ‍ॅरेचा पत्ता आहे, म्हणजे, 300. लाइन नंबर 4 पीपीचे मूल्य 1 ने वाढवते, म्हणजेच पीपी आता 302 संबोधित करण्यासाठी सूचित करेल. लाइन नंबर 5 मध्ये एक अभिव्यक्ती आहे जी तीन मूल्ये मुद्रित करते, म्हणजेच, पीपी - पी, *पीपी - ए, ** पीपी. चला त्या प्रत्येकाची गणना करूया. पीपी = 302, पी = 300 => पीपी-पी = (302-300)/2 => पीपी-पी = 1, म्हणजे, 1 मुद्रित केले जाईल. पीपी = 302, *पीपी = 202, ए = 200 => *पीपी - ए = 202 - 200 = 2/2 = 1, म्हणजे, 1 मुद्रित केले जाईल. पीपी = 302, *पीपी = 202, *( *पीपी) = 206, म्हणजे, 206 मुद्रित केले जातील. म्हणून ओळ 5 च्या परिणामी, आउटपुट 1, 1, 206 कन्सोलवर मुद्रित केले जाईल. लाइन 6 वर, *पीपी ++ लिहिले आहे. येथे, आपण लक्षात घेतले पाहिजे की दोन युनरी ऑपरेटर * आणि ++ मध्ये समान प्राधान्य असेल. म्हणून, असोसिएटिव्हिटीच्या नियमानुसार, त्याचे मूल्यांकन उजवीकडून डावीकडे केले जाईल. म्हणून *पीपी ++ अभिव्यक्ती ( *(पीपी ++)) म्हणून पुन्हा लिहिली जाऊ शकते. कारण, पीपी = 302 जे आता होईल, 304. *पीपी 204 देईल. ओळी 7 वर, पुन्हा अभिव्यक्ती लिहिली गेली आहे जी तीन मूल्ये मुद्रित करते, म्हणजेच, पीपी-पी, *पीपी-ए, *पीपी. त्या प्रत्येकाची गणना करूया. पीपी = 304, पी = 300 => पीपी - पी = (304 - 300)/2 => पीपी -पी = 2, म्हणजे, 2 मुद्रित केले जाईल. पीपी = 304, *पीपी = 204, ए = 200 => *पीपी -ए = (204 - 200)/2 = 2, म्हणजे, 2 मुद्रित केले जाईल. पीपी = 304, *पीपी = 204, *( *पीपी) = 300, म्हणजेच 300 मुद्रित केले जातील. म्हणून, ओळ 7 च्या परिणामी, आउटपुट 2, 2, 300 कन्सोलवर मुद्रित केले जाईल. ओळीवर 8 वर, ++*पीपी लिहिले आहे. असोसिएटिव्हिटीच्या नियमानुसार, हे पुन्हा लिहिले जाऊ शकते, (++ (*(पीपी))). पासून, पीपी = 304, *पीपी = 204, *पीपी = *(पी [2]) = 206 चे मूल्य जे आता ए [3] कडे सूचित करेल. 9 लाइन 9 वर, पुन्हा अभिव्यक्ती लिहिली गेली आहे जी तीन मूल्ये मुद्रित करते, म्हणजेच, पीपी-पी, *पीपी-ए, *पीपी. त्या प्रत्येकाची गणना करूया. पीपी = 304, पी = 300 => पीपी - पी = (304 - 300)/2 => पीपी -पी = 2, म्हणजे, 2 मुद्रित केले जाईल. पीपी = 304, *पीपी = 206, ए = 200 => *पीपी -ए = (206 - 200)/2 = 3, म्हणजे, 3 मुद्रित केले जाईल. पीपी = 304, *पीपी = 206, *( *पीपी) = 409, म्हणजे, 409 मुद्रित केले जातील. म्हणून, लाइन 9 च्या परिणामी, आउटपुट 2, 3, 409 कन्सोलवर मुद्रित केले जाईल. लाइन 10 वर, ++ ** पीपी लिहिलेले आहे. असोसिएटिव्हिटीच्या नियमानुसार, हे पुन्हा लिहिले जाऊ शकते, (++ (*(*(पीपी)))). पीपी = 304, *पीपी = 206, ** पीपी = 409, ++ ** पीपी => *पीपी = *पीपी +1 = 410. दुसर्‍या शब्दांत, ए [3] = 410. लाइन 11 वर, पुन्हा अभिव्यक्ती लिहिली गेली आहे जी तीन मूल्ये मुद्रित करते, म्हणजेच, पीपी-पी, *पीपी-ए, *पीपी. त्या प्रत्येकाची गणना करूया. पीपी = 304, पी = 300 => पीपी - पी = (304 - 300)/2 => पीपी -पी = 2, म्हणजे, 2 मुद्रित केले जाईल. पीपी = 304, *पीपी = 206, ए = 200 => *पीपी -ए = (206 - 200)/2 = 3, म्हणजे, 3 मुद्रित केले जाईल. ओळीवर 8 वर, ** पीपी = 410. म्हणून ओळ 9 च्या परिणामी, आउटपुट 2, 3, 410 कन्सोलवर मुद्रित केले जाईल. शेवटी, संपूर्ण प्रोग्रामचे आउटपुट दिले जाईल:

◀ मागील पुढील ▶