2010-10-01 31 views
10

मैं सी के लिए नया हूं और अभी भी पॉइंटर्स की अवधारणा को समझने की कोशिश कर रहा हूं। मुझे पता है कि एक स्वैप फ़ंक्शन कैसे लिखना है जो काम करता है ... मैं इस बात से अधिक चिंतित हूं कि यह विशेष क्यों नहीं है।सरल स्वैप फ़ंक्शन ... यह एक स्वैप क्यों नहीं करता है?

void swap(int* a, int* b) 
{ 
int* temp = a; 
a = b; 
b = temp; 
} 

int main() 
{ 
int x = 5, y = 10; 
int *a = &x, *b = &y; 
swap(a, b); 
printf(“%d %d\n”), *a, *b); 
} 
+5

स्पष्ट प्रश्न यह होगा कि इस कार्यान्वयन और आपके कार्यान्वयन के बीच क्या अंतर है? (मुझे पता है कि इस के साथ समस्या क्या है, मैं बस इसे खोजने में आपकी सहायता करने की कोशिश कर रहा हूं।) [बेशक, एसओ पर सभी उत्सुक बीवर सभी सीधे जवाब पर कूदने के लिए तैयार हैं।] –

+1

एक ठोस क्रैश सबक मूल्य से गुजरने पर। धन्यवाद पीपीएल। –

उत्तर

29

आप स्वैप फ़ंक्शन में * एस खो रहे हैं। प्रयास करें:

void swap(int* a, int* b) 
{ 
int temp = *a; 
*a = *b; 
*b = temp; 
} 

इस तरह, सिर्फ संकेत की अदला-बदली के बजाय, आप int रों अदला-बदली कर रहे हैं कि संकेत करने के लिए ओर इशारा करते हैं।

1

पॉइंटर्स मूल्य से पारित होते हैं। इसका मतलब है कि & बी अभी भी ए और बी हैं जब फ़ंक्शन से वापस आते हैं;

void swap(int* a, int* b) 
{ 
    int temp = *a; // Temp is set to the value stored at a (5) 
    *a = *b;  // value stored at a is changed to the value stored at b (10) 
    *b = temp;  // value stored in address b is changed to 5. 
} 
1

की तरह कुछ ऐसा करने का सही तरीके से प्रयास करें। आपका swap दिनचर्या उस पॉइंटर्स को पास नहीं करता है, इसलिए main के परिप्रेक्ष्य से कुछ भी नहीं हुआ है।

2

सी एक पास-दर-मूल्य भाषा है:

इस

void swap(int* a, int* b) 
{ 
int temp = *a; 
*a = *b; 
*b = temp; 
} 
1

यह स्वैप करता है। यह swap फ़ंक्शन के अंदर स्थानीय पॉइंटर्स a और b को स्वैप करता है। यह उन्हें पूरी तरह से ठीक कर देता है, जैसा कि इसे करना चाहिए।

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

10

आपका swap() समारोह काम करता है, एक फैशन के बाद - यह चर a और b कि swap() करने के लिए स्थानीय कर रहे हैं के मूल्यों स्वैप। दुर्भाग्यवश, वे a और b से main() में अलग हैं - इसलिए आप वास्तव में उन्हें स्वैप करने से कोई प्रभाव नहीं देखते हैं।

+0

यह स्वीकार्य उत्तर होना चाहिए। –

0

zildjohn1 का उत्तर ऐसा करने का सबसे आसान और स्पष्ट तरीका है। हालांकि यदि आप पॉइंटर्स को स्वैप करने पर जोर देते हैं, तो आपको सूचक को पॉइंटर को पास करना होगा क्योंकि पॉइंटर स्वयं मूल्य से गुजरता है।

4

पॉइंटर्स के बारे में सोचते समय, आपको कुछ अवशोषणों पर स्पष्ट होना चाहिए।

स्मृति में एक वस्तु। यह किसी भी प्रकार (और आकार) का हो सकता है। एक पूर्णांक वस्तु, उदाहरण के लिए, स्मृति में 4 बाइट्स (32 बिट मशीनों पर) पर कब्जा कर लेगी। एक सूचक वस्तु स्मृति में 4 बाइट्स (32 बिट मशीनों पर) पर कब्जा कर लेगी। जैसा कि स्पष्ट होना चाहिए, पूर्णांक वस्तु पूर्णांक मान रखती है; एक सूचक वस्तु अन्य वस्तुओं के पते रखती है।

सी प्रोग्रामिंग भाषा प्रतीकों (चर) को स्मृति में इन वस्तुओं का प्रतिनिधित्व करने देती है। जब आप घोषित करते हैं,

int i;

प्रतीक (चर) मैं स्मृति में कुछ पूर्णांक वस्तु का प्रतिनिधित्व करता हूं। अधिक विशेष रूप से, यह इस वस्तु के मूल्य का प्रतिनिधित्व करता है। आप प्रोग्राम में उपयोग करके इस मूल्य का उपयोग कर सकते हैं।

& मैं आपको स्मृति में इस वस्तु का पता दूंगा।

एक पॉइंटर ऑब्जेक्ट किसी अन्य ऑब्जेक्ट का पता रख सकता है। आप सिंटैक्स का उपयोग करके एक पॉइंटर ऑब्जेक्ट घोषित करते हैं,

int * ptr;

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

ptr = & i;

अब, जब आप प्रोग्राम में पीआरआर कहते हैं, तो आप इसके मूल्य का जिक्र कर रहे हैं, जो कि मेरा पता है। लेकिन यदि आप * पीआरटी कहते हैं, तो आप पीआरटी के मूल्य का जिक्र नहीं कर रहे हैं, बल्कि उस वस्तु का मूल्य जिसका पता पीआरटी में है i.e. i।

आपके स्वैप फ़ंक्शन के साथ समस्या यह है कि आप पॉइंटर्स के मानों को स्वैप कर रहे हैं, न कि ऑब्जेक्ट्स के मान जिन्हें इन पॉइंटर्स के लिए पते हैं। वस्तुओं के मूल्यों को प्राप्त करने के लिए, आपको * पीआरटी का उपयोग करना होगा। (अस्थायी)

0

उम्म शायद एक तिहाई चर का उपयोग कर के बिना इस

void swap(int** a, int** b) 
{ 
int** temp = a; 
a = b; 
b = temp; 
} 

int main() 
{ 
int x = 5, y = 10; 
int *a = &x, *b = &y; 
swap(&a, &b); 
printf(“%d %d\n”), *a, *b); 
} 
0

का उपयोग कर

void swap(int* a,int* b) 
{ 
// a = 10, b = 5; 
    *a = *a + *b; // a now becomes 15 
    *b = *a - *b; // b becomes 10 
    *a = *a - *b; // a becomes 5 
} 
-1

तुम बहुत जबकि स्वैप समारोह तो आपको बुला स्वैप समारोह के लिए एक के पते और ख भेजने की जरूरत है गधा स्वैप फोन (& एक, & ख) ताकि आप पता गुजरती हैं, और पता

-1
#define SWAP(a,b) ((a)=(b)+(a),(b)=(a)-(b),(a)=(a)-(b)) 
बदल

अच्छा काम करता है।

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