2012-10-18 8 views
5

मुझे पता है कि जब हम फ़ंक्शन में पैरामीटर पास करते हैं तो फ़ंक्शन के स्टैक में एक कॉपी बनाई जाती है और कॉलर के फ़ंक्शन में पैरामीटर के वास्तविक मान में कोई बदलाव नहीं होता है।सी में संदर्भ के दौरान क्या होता है?

जब आप फ़ंक्शन में पॉइंटर पास करते हैं तो क्या होता है? मुझे पता है कि पैरामीटर का मान कॉलर्स फ़ंक्शन में बदल जाता है। लेकिन यह आंतरिक रूप से कैसे होता है? कॉलर फ़ंक्शन में कॉल किए गए फ़ंक्शन को एक चर का उपयोग कैसे किया जाता है?

मैंने Call_by_reference page in wikipeidia से जानकारी प्राप्त करने का प्रयास किया लेकिन यह पर्याप्त नहीं था।

एक बार जब मैंने तारों के बारे में पढ़ना शुरू किया और तारों को अन्य कार्यों के पैरामीटर के रूप में पास करना शुरू कर दिया, तो मैं इसके साथ उलझन में हूं। इसके बारे में कोई मदद बहुत मददगार होगी। धन्यवाद!!!!

उत्तर

9

जब आप किसी फ़ंक्शन पर पॉइंटर पास करते हैं, तो पॉइंटर कॉपी हो जाता है। हालांकि, किसी ऑब्जेक्ट x पर पॉइंटर की एक प्रति x पर भी एक सूचक है, इसलिए इसका उपयोग x को संशोधित करने के लिए किया जा सकता है।

एक (समेकित) समानता के लिए, मान लीजिए कि x आपका घर है। सी के नियमों के अनुसार, जब आपको अपने घर में कुछ ठीक करने के लिए प्लम्बर की आवश्यकता होती है, तो आप प्लंबर को अपने घर की एक प्रति पास कर सकते हैं, उन्हें ठीक कर सकते हैं, और प्रतिलिपि आपको वापस दे सकते हैं। कहने की जरूरत नहीं है, कुछ बाइट्स से बड़े घरों के लिए, यह सभी प्रतिलिपि के कारण काफी अक्षम है। तो इसके बजाय, आप प्लंबर को अपने घर (इसका पता) पर पॉइंटर दें, ताकि प्लंबर आपके घर तक पहुंच सके और उसे स्थान पर ठीक कर सके। कॉल-बाय-रेफरेंस यही है: आप उस डेटा को पास नहीं करते हैं जिसे आप संशोधित करना चाहते हैं, लेकिन उस डेटा के लिए पॉइंटर, ताकि कैली पर को केवल के बजाय संचालित करने के लिए पर हस्ताक्षर करने के लिए जानता है।

const int broken = 0, fixed = 1; 

struct House { 
    int plumbing; 
}; 

void plumber(House *h) 
{ 
    h->plumbing = fixed; 
} 

int main() 
{ 
    struct House h; 
    h.plumbing = broken; 
    plumber(&h);   // give the plumber the address of the house, 
          // not a copy of the house 
    assert(h.plumbing == fixed); 
} 

गुजर तार के मामले में, क्या आप पारित पहले char स्ट्रिंग में करने के लिए एक सूचक है। पॉइंटर अंकगणितीय के साथ, आप निम्न तत्वों को प्राप्त कर सकते हैं।

3

सभी डेटा किसी विशेष स्थान पर किसी विशेष स्थान पर संग्रहीत किया जाता है। जब आप संदर्भ से गुजरते हैं, तो आप संदर्भ के अनुसार डेटा का पता पास करते हैं। और अप्रत्यक्ष पते का उपयोग कर डेटा में हेरफेर करने के लिए फ़ंक्शन को बताएं।

जब आप इसे किसी फ़ंक्शन पर पास करते हैं, तो पता (एक चर के) को डेटा के रूप में भेजा जाता है, लेकिन डेटा स्वयं मूल्य से गुजरता है।

4

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

void f(int *j) { 
    (*j)++; 
    int k = 20; 
    j = &k; 
} 

int main() { 
    int i = 20; 
    int *p = &i; 
    printf("i = %d, p = %p\n", i, p); 
    f(p); 
    printf("i = %d, p = %p\n", i, p); 

    return 0; 
} 

आउटपुट

i = 20, p = 0x123456 
i = 21, p = 0x123456 
4

सी में हर पैरामीटर मान द्वारा पारित कर दिया है।

3
     a=10  b=20 
         ------ ------- 
         0xf8  0Xf4 
        ---------- --------- 

       Suppose a and b are two variables in a function stack 
       when you call another function 
       foo(&a,&b) 
       actually 0xf8 and 0xf4 is caught in the definition of 
       foo(int *pa,int *pb) 

     So pa=0xf8 pb=0xf4 
      -------- --------- 
But *pa = 10 and *pb = 20 , You can manipulate like this. 
So these pointers start pointing to the actual data and any changes here are reflected in the original environment. 
+0

उदाहरण के साथ विस्तृत कोड वास्तविक कोड नहीं है। आशा है कि आप इसे प्राप्त करें – Omkant

संबंधित मुद्दे