2009-04-04 15 views
5

हे सब। मैं स्कूल के लिए एक परियोजना पर काम कर रहा हूं जहां मुझे कई कार्यों के माध्यम से संदर्भ द्वारा कुछ पैरामीटर पारित करने की आवश्यकता है। मैं समझता हूँ कि मैं इस तरह संदर्भ द्वारा कैसे पारित कर सकते हैं चर जहां से दूसरे कार्य करने के लिए घोषित किया गया है,:एकाधिक कार्यों के माध्यम से संदर्भ द्वारा पास

main() { 
    int x = 0; 
    int y = 0; 
    int z = 0; 

    foo_function(&x, &y, &z); 
} 

int foo_function(int* x, int* y, int* z) { 
    *x = *y * *z; 
    return 0; 
} 

हालांकि, कैसे मैं एक और कार्य करने के लिए foo समारोह से एक्स, वाई, और z पारित होगा? ऐसा कुछ मुझे सभी प्रकार की कंपाइलर चेतावनियां देता है।

int foo_function(int* x, int* y, int* z) { 
    *x = *y * *z; 
    bar(&x, &y, &z); 
    return 0; 
} 

int bar(int* x, int* y, int* z) { 
    //some stuff 
} 
+0

Gaaakkk बनाने की जरूरत नहीं है ... कोड के समान लाइन पर घुंघराले ब्रेस खोलें ... –

+1

जैसा कि भगवान स्वयं ही इसका इरादा रखते थे। – jergason

उत्तर

11

बस का उपयोग करें:

bar(x, y, z); 

पहला, दूसरा, और जेड पहले से ही संकेत दिए गए हैं - सिर्फ उन्हें सीधे गुजरती हैं।

याद रखें - एक सूचक स्मृति में एक स्थान है। स्थान नहीं बदलता है। जब आप पॉइंटर को घटाते हैं (* x = ... का उपयोग करके), तो आप उस स्थान पर मान सेट कर रहे हैं। लेकिन जब आप इसे किसी फ़ंक्शन में पास करते हैं, तो आप बस स्मृति में स्थान पारित कर रहे हैं। आप उसी स्थान को किसी अन्य फ़ंक्शन में पास कर सकते हैं, और यह ठीक काम करता है।

2

आपको कुछ भी करने की आवश्यकता नहीं है, वे पहले से ही संदर्भ हैं।

int foo_function(int* x, int* y, int* z) { 
    bar(x, y, z); 
    return 0; 
} 

int bar(int* x, int* y, int* z) { 
    //some stuff 
} 
2

foo_function एक्स y और z में पहले से ही संकेत (int *) है, तो आप बार (एक्स, वाई, जेड) कर सकते हैं।

2
int foo_function(int* x, int* y, int* z) { 
    *x = *y * *z; 
    /* x, y and z are pointers to int 
     &x, &y and &z are pointers to pointer to int 
     bar expects pointers to int, so call bar as: 
    */ 
    bar(x, y, z); 
    return 0; 
} 
2

सी संदर्भ द्वारा गुजरने की कोई धारणा नहीं है। पैरामीटर हमेशा मूल्य से पारित होते हैं। हालांकि, पॉइंटर्स का उपयोग करते समय, यह मान वास्तव में आपके वास्तविक मूल्य का सूचक है।

लेकिन क्या आप

foo_function(&x, &y, &z); 

वास्तव में सूचक है, जो अनिवार्य व्यर्थ है के एक पते पाने के लिए कोशिश कर रहा है के साथ कर रहे हैं (यदि आप एक int* के बजाय एक int** पास होता)।

तो,

foo_function(x, y, z); 

सही कॉल किया जाएगा, के रूप में x, y और z पहले से ही संकेत दिए गए हैं और आप की ओर इशारा करते श्रृंखला किसी भी अब :)

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