हिन्दी में वैबसाइट डिजाइनिंग सीखना चाहते हैं तो हमारी साइट code sikho hindi को Subscribe करें

What is C++ Reference vs Pointer

C++ Reference vs Pointer- सी ++ संदर्भ बनाम सूचक

What is C++ Reference vs Pointer


What is C++ Reference vs Pointer


सी ++ संदर्भ और सूचक समान प्रतीत होते हैं, लेकिन कुछ अंतर हैं जो उनके बीच मौजूद हैं। एक संदर्भ एक चर है जो मौजूदा चर का दूसरा नाम है, जबकि सूचक चर है जो किसी अन्य चर के पते को संग्रहीत करता है।


What is Reference- संदर्भ क्या है ?


एक संदर्भ एक चर है जिसे पहले से मौजूद चर के लिए दूसरे नाम के रूप में संदर्भित किया जाता है। एक वेरिएबल का रेफरेंस दूसरे वेरिएबल के एड्रेस को स्टोर करके बनाया जाता है।


एक संदर्भ चर को स्वत: संकेत के साथ एक स्थिर सूचक के रूप में माना जा सकता है। यहाँ, स्वचालित संकेत का अर्थ है कि संकलक स्वचालित रूप से अप्रत्यक्ष ऑपरेटर (*) लागू करता है।


संदर्भ का उदाहरण:


int &a = i;  


उपरोक्त घोषणा में, 'a' 'i' वेरिएबल के लिए एक अन्य नाम है। हम 'i' वेरिएबल को 'a' वेरिएबल के माध्यम से भी संदर्भित कर सकते हैं।


आइए एक उदाहरण के जरिए समझते हैं।


#include <iostream>  

using namespace std;  

int main()  

{    

   int i=8;    // variable initialization  

   int &a=i; // creating a reference variable  

   cout<<"The value of 'i' variable is :"<<a;  

   return 0;  

}  


उपरोक्त कोड में, हमने एक रेफरेंस वेरिएबल बनाया है, यानी, 'i' वेरिएबल के लिए 'a'। रेफरेंस वेरिएबल क्रिएट करने के बाद हम 'a' वेरिएबल की मदद से 'i' की वैल्यू को एक्सेस कर सकते हैं।


What is Pointer?- सूचक क्या है ?


एक सूचक एक चर है जिसमें दूसरे चर का पता होता है। मेमोरी लोकेशन को एक्सेस करने के लिए (*) ऑपरेटर की मदद से इसे डीरेफरेंस किया जा सकता है, जिस पर पॉइंटर पॉइंट करता है।


Differences between Reference and Pointer


संदर्भ और सूचक के बीच निम्नलिखित अंतर हैं:


परिभाषा


एक संदर्भ चर पहले से मौजूद चर का दूसरा नाम है। यह मुख्य रूप से 'पास बाय रेफरेंस' में उपयोग किया जाता है जहां संदर्भ चर को फ़ंक्शन के पैरामीटर के रूप में पारित किया जाता है और जिस फ़ंक्शन को यह चर पारित किया जाता है वह चर की मूल प्रति पर काम करता है।


आइए एक सरल उदाहरण के माध्यम से समझते हैं।


#include <iostream>  

using namespace std;  

void func(int &);  

int main()  

{  

   int a=10;  

   std::cout <<"Value of 'a' is :" <<a<< std::endl;  

  func(a);   

  std::cout << "Now value of 'a' is :" <<a<< std::endl;  

  return 0;  

}  

void func(int &m)  

{  

   m=8;  

}  


Output:-


Value of 'a' is :10                                                                                                             

Now value of 'a' is :8  


जबकि, पॉइंटर एक वेरिएबल है जो दूसरे वेरिएबल के एड्रेस को स्टोर करता है। यह प्रोग्रामिंग को आसान बनाता है क्योंकि इसमें कुछ वेरिएबल का मेमोरी एड्रेस होता है।


घोषणा


हम एक वेरिएबल के पहले '&' सिंबल जोड़कर एक रेफरेंस वेरिएबल घोषित कर सकते हैं। यदि इस चिन्ह का प्रयोग अभिव्यक्ति में किया जाता है, तो इसे एड्रेस ऑपरेटर के रूप में माना जाएगा।


पॉइंटर वेरिएबल का उपयोग करने से पहले, हमें एक पॉइंटर वेरिएबल घोषित करना चाहिए, और यह वेरिएबल एक वेरिएबल से पहले '*' ऑपरेटर जोड़कर बनाया जाता है।


रीअसाइनमेंट


हम संदर्भ चर को पुन: असाइन नहीं कर सकते। अब, हम नीचे दिए गए एक सरल उदाहरण को लेते हैं:


#include <iostream>  

using namespace std;  

void func(int &);  

int main()  

{  

  int i;    // variable declaration  

  int k;    // variable declaration  

  int &a=i;  

  int &a=k; // error  

  return 0;  

}  


उपरोक्त कोड त्रुटि दिखाता है कि int &a की एकाधिक घोषणाओं की अनुमति नहीं है। इसलिए, उपरोक्त कार्यक्रम का निष्कर्ष है कि संदर्भ चर के लिए पुन: असाइनमेंट ऑपरेशन मान्य नहीं है।


जबकि, पॉइंटर्स को फिर से असाइन किया जा सकता है। यह पुनर्मूल्यांकन तब उपयोगी होता है जब हम डेटा संरचनाओं जैसे कि लिंक की गई सूची, पेड़ आदि के साथ काम कर रहे होते हैं।


स्मृति पता


संदर्भ के मामले में, संदर्भ और वास्तविक चर दोनों एक ही पते को संदर्भित करते हैं। नया वेरिएबल रेफरेंस वेरिएबल को तब तक असाइन नहीं किया जाएगा जब तक कि वास्तविक वेरिएबल को या तो हटा नहीं दिया जाता है या दायरे से बाहर नहीं कर दिया जाता है।


आइए इस परिदृश्य को एक उदाहरण के माध्यम से समझते हैं।


#include <iostream>  

using namespace std;  

void func(int &);  

int main()  

{  

  int i;  

  int &a=i;  

  std::cout << "The address of 'a' variable is : " <<&a<< std::endl;  

  std::cout << "The address of 'i' variable is : " <<&i<< std::endl;  

  return 0;  

}  


Output:-


The address of 'a' variable is : 0x7fff078e7e44  


उपरोक्त आउटपुट से पता चलता है कि संदर्भ चर और वास्तविक चर दोनों का एक ही पता है।


पॉइंटर्स के मामले में, पॉइंटर वैरिएबल और वास्तविक वैरिएबल दोनों में अलग-अलग मेमोरी एड्रेस होंगे। इसे एक उदाहरण के माध्यम से समझते हैं।


#include <iostream>  

using namespace std;  

int main()  

{  

    int k;  

    int *p;  

    p=&k;  

    cout<<"The memory address of p variable is :"<<&p;  

    cout<<"\nThe memory address of k variable is :"<<&k;  

    return 0;  

}  


Output:-


The memory address of p variable is :0x7ffcc5c164b8   


शून्य मूल्य


हम रेफरेंस वेरिएबल को NULL वैल्यू असाइन नहीं कर सकते हैं, लेकिन पॉइंटर वैरिएबल को NULL वैल्यू के साथ असाइन किया जा सकता है।


अविवेक


पॉइंटर्स में पॉइंटर टू पॉइंटर ऑफरिंग एक से अधिक स्तर के संकेत हो सकते हैं।


#include <iostream>  

using namespace std;  

int main()  

{  

 int *p;  

 int a=8;  

 int **q;  

 p=&a;  

 q=&p;  

std::cout << "The value of q is : " <<*q<< std::endl;  

return 0;  

}  


उपरोक्त कोड में, पॉइंटर 'p' वेरिएबल 'a' की ओर इशारा कर रहा है जबकि 'q' एक डबल पॉइंटर है जो 'p' की ओर इशारा कर रहा है। इसलिए, हम कह सकते हैं कि 'p' का मान 'a' वेरिएबल का एड्रेस होगा और 'q' वेरिएबल का मान 'p' वेरिएबल का एड्रेस होगा।


Output:-


The value of q is : 0x7ffd104891dc 


संदर्भ के मामले में, संदर्भ का संदर्भ संभव नहीं है। यदि हम सी ++ प्रोग्राम करने का प्रयास करते हैं तो संकलन-समय त्रुटि फेंक देंगे


आइए इस परिदृश्य को एक उदाहरण के माध्यम से समझते हैं।


#include <iostream>  

using namespace std;  

int main()  

{  

  int a=8; // variable initialization  

 int &p=a; // creating a reference variable for ?a? variable.  

 int &&q=p;  // reference to reference is not valid, it throws an error.  

 return 0;  

}  


Output:-


main.cpp: In function 'int main()':

main.cpp:18:10: error: cannot bind 'int' lvalue to 'int&&'

int &&q=p;


अंकगणितीय आपरेशनस


जैसा कि हम जानते हैं कि अंकगणितीय संक्रियाओं को "Pointer Arithmetic" नाम के पॉइंटर्स पर लागू किया जा सकता है, लेकिन अंकगणितीय संक्रियाओं को संदर्भों पर लागू नहीं किया जा सकता है। कोई शब्द नहीं है, अर्थात, संदर्भ अंकगणित C++ में मौजूद है।


आइए पॉइंटर्स का एक सरल उदाहरण देखें।


#include <iostream>  

using namespace std;  

int main()  

{  

 int a[]={1,2,3,4,5}; // array initialization  

  int *ptr;  // pointer declaration  

  ptr=a; assigning base address to pointer ptr.  

  cout<<"The value of *ptr is :"<<*ptr;  

  ptr=ptr+1;  // incrementing the value of ptr by 1.  

  std::cout << "\nThe value of *ptr is: " <<*ptr<< std::endl;  

  return 0;  

}  


Output:-


The value of *ptr is :1                                                                                                       

The value of *ptr is: 2


आइए एक उदाहरण के माध्यम से संदर्भों को समझते हैं।


#include <iostream>  

using namespace std;  

int main()  

{  

   

 int value=90;  // variable declaration  

 int &a=value;   // assigning value to the reference  

 &a=&a+5 // arithmetic operation is not possible with reference variable, it throws an error.  

 return 0;  

}  


उपरोक्त कोड संकलन-समय त्रुटि फेंक देगा क्योंकि संदर्भों के साथ अंकगणितीय परिचालनों की अनुमति नहीं है।