2009-12-28 25 views
7

आप फ़ंक्शन में पॉइंटर्स कैसे स्विच करते हैं?सी प्रोग्रामिंग भाषा में एक फ़ंक्शन में स्विच पॉइंटर्स

void ChangePointers(int *p_intP1, int *p_intP2); 

int main() { 

int i = 100, j = 500; 
int *intP1, *intP2; /* pointers */ 
intP1 = &i; 
intP2 = &j; 
printf("%d\n", *intP1); /* prints 100 (i) */ 
printf("%d\n", *intP2); /* prints 500 (j) */ 
ChangePointers(intP1, intP2); 


printf("%d\n", *intP1); /* still prints 100, would like it swapped by now */ 
printf("%d\n", *intP2); /* still prints 500 would like it swapped by now */ 
}/* end main */ 

void ChangePointers(int *p_intP1, int *p_intP2) { 
int *l_intP3; /* local for swap */ 
l_intP3 = p_intP2; 
p_intP2 = p_intP1; 
p_intP1= l_intP3; 
} 
+5

सी में, * सब कुछ * मूल्य से पारित किया जाता है। यदि आप किसी फ़ंक्शन को कुछ बदलना चाहते हैं, तो आपको इसके लिए एक पॉइंटर पास करना होगा। इसलिए, यदि आप एक सूचक को एक सूचक बदलने के लिए चाहते हैं, तो आपको इसके लिए एक सूचक पास करने की आवश्यकता है। यानी, पॉइंटर को पॉइंटर पास करें। एक बार जब आप इस तरह सोचना शुरू कर देते हैं, तो सब कुछ आसान हो जाता है (ठीक है, सब कुछ नहीं, लेकिन कम से कम फ़ंक्शन-कॉलिंग!) –

उत्तर

14

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

void ChangePointers(int **p_intP1, int **p_intP2); /*Prototype*/ 

void ChangePointers(int **p_intP1, int **p_intP2) /*Definition*/ 
{ 
    int *l_intP3; /* local for swap */ 
    l_intP3 = *p_intP2; 
    *p_intP2 = *p_intP1; 
    *p_intP1= l_intP3; 
} 

संगत कॉल() होना चाहिए: यह करके देखें

ChangePointers(&intP1, &intP2);/*Passing in the address of the pointers instead of their values*/ 
+0

ठीक है, बहुत धन्यवाद! –

5

पॉइंटर को पॉइंटर लेने के लिए हस्ताक्षर बदलें।

void ChangePointers(int **p_intP1, int **p_intP2) { 
int *l_intP3; /* local for swap */ 
l_intP3 = *p_intP2; 
*p_intP2 = *p_intP1; 
*p_intP1= l_intP3; 
} 

या, यदि आप कॉलिंग कोड को समान दिखाना चाहते हैं, तो सी ++ संदर्भों जैसा दिखता है, मैक्रो का उपयोग करें।

void ChangePointersImpl(int **p_intP1, int **p_intP2) { 
int *l_intP3; /* local for swap */ 
l_intP3 = *p_intP2; 
*p_intP2 = *p_intP1; 
*p_intP1= l_intP3; 
} 

#define ChangePointers(a,b) ChangePointersImpl(&a, &b) 
2

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

int intP3; /* local for swap */ 
intP3 = *p_intP2; 
*p_intP2 = *p_intP1; 
*p_intP1 = intP3; 

आप संकेत के मूल्यों को बदलना चाहते हैं खुद को (जैसे पते) तुम, उन संकेत की ओर इशारा पारित करने के लिए नहीं की जरूरत है खुद पॉइंटर्स।

13

आपको पॉइंटर को पॉइंटर चाहिए।

ChangePointers(&intP1, &intP2); 

void ChangePointers(int **p_intP1, int **p_intP2) { 
     int *l_intP3; 
     l_intP3 = *p_intP2; 
     *p_intP2 = *p_intP1; 
     *p_intP1 = l_intP3; 
} 
1

आप संकेत स्विच करना चाहते हैं, तो आप पास-में संकेत के बजाय सूचक मूल्यों के पते करना होगा:

void ChangePointers(int **p_intP1, int **p_intP2) { 
int *l_intP3; /* local for swap */ 
l_intP3 = *p_intP2; 
*p_intP2 = *p_intP1; 
*p_intP1= l_intP3; 
} 
2

इन सभी प्रश्नों के उत्तर के अलावा, मैं सिर्फ जोड़ना चाहते थे कि जब मैं एक स्थिति में संकेत समझने समस्या थी इस तरह मैं इसे एक int की तरह सरल कुछ ले जाऊंगा। यदि आप एक समारोह के लिए एक पूर्णांक गुजर रहे थे कहते हैं:

int x = 10; 
change_int(x); 
printf("%d",x); 
void change_int(int y) 
{ 
    y = 20; 
} 

एक्स स्पष्ट रूप से अभी भी वास्तव में एक्स को बदलने के लिए 10 प्रिंट होगा, ताकि आप एक्स सीधे संशोधित कर सकते हैं एक्स के लिए सूचक पारित करने के लिए होगा।

int x = 10; 
change_int(&x); 
printf("%d",x); 
void change_int(int *y) 
{ 
    *y = 20; 
} 

अब एक्स 20. अब प्रिंट सिर्फ इस एक ही तर्क लागू के रूप में अगर एक्स एक सूचक था जाएगा, तो आप एक डबल सूचक पारित करने के लिए की है। उम्मीद है की यह मदद करेगा।

1

कृपया समझाए गए एक और समान प्रश्न के लिए here देखें। एक बार जब आप इसे पढ़ लेंगे, तो इससे आपके ऊपर उपरोक्त अन्य उत्तरों को समझना आसान हो जाएगा।

उम्मीद है कि यह मदद करता है, सर्वश्रेष्ठ संबंध, टॉम।

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