2013-03-28 6 views
12

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

void swap(int *r, int *s) 
{ 
    int *pSwap = r; 
    r = s; 
    s = pSwap; 
    return; 
} 

int main() 
{ 
    int p = 7; 
    int q = 9; 
    swap(&p, &q); 
    cout << "p = " << p << "q= " << q << endl; 
    return 0; 
} 

प्रिंटों: पी = 7q = 9

+2

आप पॉइंटर्स की प्रतियों को जोड़ रहे हैं, न कि वे जो डेटा इंगित करते हैं। यह सिर्फ 'std :: स्वैप (पी, क्यू) के लिए आसान है; '। या, यदि प्रस्ताव वास्तव में इसे बनाता है, 'पी: =: क्यू;' भविष्य में कभी-कभी। – chris

+3

@ क्रिस: वायाट। क्या आप प्रस्तावित प्रस्ताव से लिंक कर सकते हैं? (प्रतीकों के लिए खोज मुश्किल है।) – GManNickG

+1

@GManNickG, हाँ, यकीन है। [यहां आप जाओ] (http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2013/n3553.pdf)। मुझे इसे बनाने में बहुत संदेह था। – chris

उत्तर

11

अपने swap समारोह के अंदर, तुम सिर्फ संकेत की दिशा बदल रहे हैं, यानी, सूचक अंक (यहां वस्तुओं बदलने के लिए, विशेष रूप से इसके बारे में पता है ऑब्जेक्ट्स p और q)। पॉइंटर द्वारा इंगित वस्तुओं को बिल्कुल नहीं बदला जाता है।

आप सीधे std::swap का उपयोग कर सकते हैं। या निम्न की तरह अपने स्वैप समारोह कोड:

void swap(int *r, int *s) 
{ 
    int temp = *r; 
    *r = *s; 
    *s = temp; 
    return; 
} 
+0

यदि ओपी पॉइंटर्स या मानकों को इंगित करने वाले मानों को स्वैप करना चाहता है तो यह मुझे स्पष्ट नहीं है। –

+0

@ShafikYaghmour क्या ओपी ने पॉइंटर्स को स्वैप किया था, इसलिए मुझे लगता है कि ओपी वैल्यू पॉइंटर्स पॉइंट को स्वैप करना चाहता है। – taocp

+0

@SongWang यह सही है। मैं अब अपनी गलती देखता हूं। धन्यवाद। –

1

लाइन r=s सूचक s की प्रतिलिपि करने के लिए सूचक r की एक प्रति स्थापित कर रही है।

बजाय (आप एसटीडी का उपयोग नहीं करना चाहते हैं: स्वैप) आप इस

void swap(int *r, int *s) 
{ 
    int tmp = *r; 
    *r = *s; 
    *s = tmp; 
} 
1

करने की जरूरत है आप अपने मूल्यों, जो संकेत नहीं हैं के लिए संदर्भ पारित कर दिया। इसलिए, कंपाइलर अस्थायी (int*) बनाता है और फ़ंक्शन में उन्हें पास करता है।

p और q के बारे में सोचें: वे चर हैं, जिसका अर्थ है कि वे स्मृति में कहीं भी आवंटित स्लॉट हैं (ढेर पर, लेकिन यह यहां महत्वपूर्ण नहीं है)। "पॉइंटर्स को स्वैपिंग" के बारे में आप किस अर्थ में बात कर सकते हैं? ऐसा नहीं है कि आप स्लॉट के पते स्वैप कर सकते हैं।

आप जो कर सकते हैं वह दो कंटेनरों के मूल्य को स्वैप कर देता है जो वास्तविक पते रखते हैं - और वे पॉइंटर्स हैं।

यदि आप पॉइंटर्स को स्वैप करना चाहते हैं, तो आपको पॉइंटर चर बनाना होगा, और उन्हें फ़ंक्शन में पास करना होगा।

इस तरह

:

int p = 7; 
int q = 9; 

int *pptr = &p; 
int *qptr = &q; 
swap(pptr, qptr); 
cout << "p = " << *pptr << "q= " << *qptr << endl; 
return 0; 
0

आप अपने उदाहरण में संदर्भ द्वारा गुजर नहीं कर रहे हैं। यह संस्करण संदर्भ से गुजरता है,

void swap2(int &r, int &s) 
{ 
    int pSwap = r; 
    r = s; 
    s = pSwap; 
    return; 
} 

int main() 
{ 
    int p = 7; 
    int q = 9; 
    swap2(p, q); 
    cout << "p = " << p << "q= " << q << endl; 
    return 0; 
} 

संदर्भ द्वारा उत्तीर्ण मूल्य या पॉइंटर द्वारा गुजरने जैसा नहीं है। एक स्पष्टीकरण के लिए वेब पर सी ++ ट्यूटोरियल देखें। मेरे दिमाग में वेब पर आसानी से मिलने वाले अच्छे विवरण संग्रहीत करने वाले कोशिकाओं को बर्बाद करने के लिए बहुत छोटा है।

+0

जो मूल्यों को स्वैप करता है, कोई पॉइंटर्स नहीं। समारोह को संदर्भ लेने के रूप में घोषित करके, आपने अभी 'स्वैप' फ़ंक्शन के अर्थशास्त्र को बदल दिया है। 'r = s' जब' r' और 's' संदर्भ हैं, वही चीज़ '* p = * q' के रूप में होती है जब' p' और 'q' पॉइंटर्स होते हैं। स्मृति स्थानों को देखकर अपने डीबगर पर जांचें जहां पी और क्यू संग्रहीत हैं। –

+0

बहुत धन्यवाद यूरो माइक्रोली –

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