2010-11-15 13 views
11

यदि मेरे पास कोई ऐसा कार्य है जो int *& लेता है, तो इसका क्या अर्थ है? मैं उस फ़ंक्शन को केवल एक int या पॉइंटर int कैसे पास कर सकता हूं?फ़ंक्शन पैरामीटर में * और माध्य क्या है

function(int *& mynumber); 

जब भी मैं उस समारोह में यह कहते हैं करने के लिए एक सूचक पारित करने के लिए प्रयास करें:

error: no matching function for call to 'function(int *)' 
note: candidate is 'function(int *&)' 
+3

कि त्रुटि की वजह से है कि वास्तव में क्या मैं के साथ के बारे में बात कर रहा था "यह एक एल-वैल्यू होना चाहिए, सिर्फ एक आर-वैल्यू नहीं"। प्रश्न में नियम यह है कि "आप अस्थायी संदर्भ में अस्थायी बाध्य नहीं कर सकते", और "पता" ऑपरेटर का नतीजा अस्थायी है। – Flexo

उत्तर

20

यह एक पूर्णांक के लिए सूचक के लिए एक संदर्भ है। इसका मतलब है कि प्रश्न में कार्य सूचक और साथ ही स्वयं को संशोधित कर सकता है।

तुम बस में एक सूचक पारित कर सकते हैं, एक जटिलता जा रहा है कि सूचक एक एल-मूल्य ही नहीं, एक r-मान होना आवश्यक है, तो उदाहरण के लिए

int myint; 
function(&myint); 
अकेले

पर्याप्त नहीं है और न तो 0/NULL स्वीकार्य होगा, जहां:

int myint; 
int *myintptr = &myint; 
function(myintptr); 

स्वीकार्य होगा। जब फ़ंक्शन लौटाता है तो यह काफी संभव है कि myintptr अब यह इंगित नहीं करेगा कि यह प्रारंभ में क्या इंगित कर रहा था।

int *myintptr = NULL; 
function(myintptr); 

यह भी समझ में आ सकता है कि फ़ंक्शन एक पूर्ण सूचक देने पर स्मृति आवंटित करने की अपेक्षा कर रहा था। यह देखने के लिए कि पॉइंटर का उपयोग करने की अपेक्षा की जाती है, फ़ंक्शन के साथ प्रदान किए गए दस्तावेज़ों को देखें (या स्रोत पढ़ें!)।

10

सीधे शब्दों में: एक सूचक के लिए एक संदर्भ।

सी में, संदर्भ के बिना, परंपरागत तरीके से करने के लिए एक सूचक "स्थानांतरित", एक सूचक के सूचक के पारित करने के लिए है:

void c_find(int** p, int val); /* *p will point to the node with value 'val' */ 

सी ++ में, इस संदर्भ सिंटैक्स से व्यक्त किया जा सकता, से बचने के लिए अजीब डबल dereference।

void cpp_find(int*& p, int val); // p will point to the node with value 'val' 
+3

+1 मुझे यह पसंद है कि आपने इसे सी ++ * और * सी – Audrius

7

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

एक चर को पास करने के लिए, बस एक int * पास करें। चूंकि ऑवुडलैंड बताता है कि क्या पास किया गया है l-value होना चाहिए।

संपादित करें:

awoodland के उदाहरण पर निर्माण करने के लिए:

#include <iostream> 

void foo(int*& var) 
{ 
    delete var; 
    var = new int; 
} 

int main(int argc, char* argv[]) 
{ 
    int* var = NULL; 

    std::cout << var << std::endl; 

    foo(var); // this function can/will change the value of the pointer 

    std::cout << var << std::endl; 

    delete var; 

    return 0; 
} 
+0

+1 में कैसे समझाया, एल-वैल्यू के लिए अच्छा संदर्भ, मुझे लिंक करने के लायक कुछ भी नहीं मिला। – Flexo

+0

@awoodland, धन्यवाद। मैं मानता हूं कि यह मेरे लिए पहली Google हिट थी। मैं कुछ और निश्चित खोज रहा था, लेकिन एक बेहतर संदर्भ नहीं मिला। – luke

+0

अगर मैं अच्छी तरह से समझता हूं, अगर मेरे पास एक पॉइंटर लौटने वाला फ़ंक्शन है, तो मुझे इसे फ़ंक्शन में पास करने से पहले इसे किसी अन्य पॉइंटर को असाइन करना होगा? – DogDog

0

यह int के सूचक के लिए एक संदर्भ है - आप इस समारोह के लिए एक int के संबोधन में पारित करने के लिए है, और ध्यान रखें कि फ़ंक्शन संदर्भ के माध्यम से सूचक को बदल सकता है।

बेवकूफ उदाहरण:

void func(int*& iref) 
{ 
    iref = new int; 
} 

int main() 
{ 
    int i(0); 
    int* pi(&i); 

    func(pi); 
    // pi no longer equal to &i 

    return 0; 
} 
2

function एक पैरामीटर लेता है, mynumber जो int पर पॉइंटर का संदर्भ है।

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

function(int*& mynumber) 
{ 
    if(!mynumber) 
    mynumber = new int; 
    *mynumber = 42; 
} 

... तो फिर कुछ इस तरह बुला कोड में हो सकता है:

int main() 
{ 
    int* mynumber = 0; 
    function(mynumber); // function will change what "mynumber" points to 
    cout << *mynumber; 
    return 0; 
} 
संबंधित मुद्दे