2013-01-08 45 views
44

मैंने इंटरनेट पर अलग-अलग चीजें पढ़ीं और उलझन में आया, क्योंकि हर वेबसाइट अलग-अलग चीजें कहती है।"संदर्भ" और "dereferencing" का अर्थ

सी

मैं * के बारे में संदर्भित ऑपरेटर और & अपसंदर्भन ऑपरेटर पढ़ बारे में बोलते हुए; या उस संदर्भ में मतलब है कि एक चर के लिए सूचक बिंदु बनाना और dereferencing संकेतक के मान को एक्सेस कर रहा है जो पॉइंटर इंगित करता है। तो मैं उलझन में आया।

क्या मुझे "संदर्भ और डी-रेफरेंसिंग" के बारे में एक सरल लेकिन पूरी तरह से स्पष्टीकरण मिल सकता है?

+2

http://c-faq.com/~scs/cgi-bin/faqcat.cgi?sec=ptrs –

+6

ध्यान दें कि आधिकारिक नाम पते ('&') और संकेत ('*') ऑपरेटर हैं । –

+3

आपके पास ऑपरेटर मिश्रित हैं। * अपमानजनक ऑपरेटर है। – cheznead

उत्तर

55

साधन एक मौजूदा चर का पता लेने संदर्भित (& का प्रयोग करके) एक सूचक चर सेट करने के लिए।

int c1; 
int* p1; 
c1 = 5; 
p1 = &c1; 
//p1 references c1 

एक सूचक * ऑपरेटर का उपयोग का मतलब है अपसंदर्भन (तारांकन: आदेश वैध होने के लिए, एक सूचक तारांकन बिना सूचक के रूप में एक ही प्रकार के एक चर के पते पर स्थापित किया जाना है, चरित्र) सूचक पर संग्रहीत मूल्य तक पहुंचने के लिए: नोट: पॉइंटर के पते पर संग्रहीत मान उसी प्रकार का मान होना चाहिए जो पॉइंटर "पॉइंट्स" के चर के प्रकार के रूप में होना चाहिए, लेकिन कोई गारंटी नहीं है यह तब तक मामला है जब तक पॉइंटर सही ढंग से सेट नहीं किया गया हो। पॉइंटर पॉइंट्स वैरिएबल का प्रकार बाहरीतम तारांकन को कम करता है।

int n1; 
n1 = (*p1); 

अमान्य dereferencing या दुर्घटनाओं का कारण नहीं है हो सकता है:

  • किसी भी अप्रारंभीकृत सूचक का कोई भी dereferencing एक दुर्घटना
  • अमान्य प्रकार कलाकारों के साथ अपसंदर्भन पैदा कर सकता है एक दुर्घटना का कारण करने की क्षमता होगा।
  • एक चर कि गतिशील रूप से आवंटित किया गया था और बाद में डी-आवंटित किया गया था एक दुर्घटना
  • एक चर के बाद से क्षेत्र से बाहर चला गया है यह भी एक दुर्घटना का कारण बन सकती करने के लिए एक सूचक dereferencing पैदा कर सकता है के लिए एक सूचक dereferencing।

अमान्य संदर्भित अधिक करने के लिए दुर्घटनाओं से संकलक त्रुटियां होने की संभावना है, लेकिन यह एक अच्छा विचार है इस के लिए संकलक पर भरोसा करने की नहीं है।

संदर्भ:

http://www.codingunit.com/cplusplus-tutorial-pointers-reference-and-dereference-operators

& is the reference operator and can be read as “address of”. 
* is the dereference operator and can be read as “value pointed by”. 

http://www.cplusplus.com/doc/tutorial/pointers/

& is the reference operator  
* is the dereference operator 

http://en.wikipedia.org/wiki/Dereference_operator

The dereference operator * is also called the indirection operator. 
13

मैं हमेशा सुना है उन्हें विपरीत अर्थ में प्रयोग किया:

  • & संदर्भ ऑपरेटर है - यह आप किसी वस्तु

  • * के लिए एक संदर्भ (सूचक) देता है भिन्नता ऑपरेटर है - यह एक संदर्भ लेता है (सूचक) और आपको ऑब्जेक्ट को संदर्भित करता है;

8

एक शुरुआत के लिए, आप उन्हें पीछे की ओर है: & संदर्भ और * भिन्नता है।

चर की स्मृति पता तक पहुँचने एक चर का अर्थ है संदर्भित:

int i = 5; 
int * p; 
p = &i; //&i returns the memory address of the variable i. 

एक स्मृति पते पर संग्रहीत चर तक पहुँचने एक चर साधन अपसंदर्भन:

int i = 5; 
int * p; 
p = &i; 
*p = 7; //*p returns the variable stored at the memory address stored in p, which is i. 
//i is now 7 
+2

पकड़ो, परिवर्तनीय का मेमोरी पता मैं 5 नहीं है, 5 मेरा मान है। यही है ना स्मृति पता कुछ ऐसा होना चाहिए .. 0XA234948 ... जिसे हमें जानने की आवश्यकता नहीं है। – Nayana

+0

@ डॉकबडू सही। मेरा मान 5 है, स्मृति पता कुछ मूल्य होगा जिसका हमारा कोई नियंत्रण नहीं है (अक्सर हेक्साइडसिमल में व्यक्त किया जाता है)। – ApproachingDarknessFish

4

नीचे व्याख्या पढ़ सकते हैं:

int main() 
{ 
    int a = 10;// say address of 'a' is 2000; 
    int *p = &a; //it means 'p' is pointing[referencing] to 'a'. i.e p->2000 
    int c = *p; //*p means dereferncing. it will give the content of the address pointed by 'p'. in this case 'p' is pointing to 2000[address of 'a' variable], content of 2000 is 10. so *p will give 10. 
} 

निष्कर्ष:

  1. & [पता ऑपरेटर] संदर्भ के लिए उपयोग किया जाता है।
  2. * [स्टार ऑपरेटर] का उपयोग डी-रेफरेंसिंग के लिए किया जाता है।