2013-02-07 40 views
5

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

#include <stdio.h> 
#include <stdlib.h> 

int *p = NULL; 
void test(int * pt1, int**pt2){ 
    p = (int*)malloc(sizeof(int));  
    pt1 = p; 
    *pt2 = p; 
    printf("p points to %p\n", p); 
    printf("pt1 points to %p\n", pt1); 
    printf("pt2 points to %p\n", *pt2); 
} 

int main(void) { 
    int *p1 = NULL; 
    int *p2 = NULL; 

    printf("p points to %p\n", p); 
    printf("p1 points to %p\n", p1); 
    printf("p2 points to %p\n", p2); 

    test(p1, &p2); 

    printf("p points to %p\n", p); 
    printf("p1 points to %p\n", p1); 
    printf("p2 points to %p\n", p2); 

    return 0; 
} 

उत्पादन:

p points to (nil) 
p1 points to (nil) 
p2 points to (nil) 
p points to 0x8acb008 
pt1 points to 0x8acb008 
pt2 points to 0x8acb008 
p points to 0x8acb008 
p1 points to (nil) 
p2 points to 0x8acb008 
+0

सी में, सब कुछ पारित हो जाता है मूल्य से पॉइंटर्स कोई अपवाद नहीं है। –

उत्तर

4

test के अंदर pt1 अपने आप में एक अलग सूचक है। यह कहना है कि यह केवल p1 के लिए एक उपनाम है, बल्कि एक प्रतिलिपि जो केवल कॉल के जीवनकाल के लिए मौजूद है।

इस प्रकार आप जो भी असाइनमेंट करते हैं वह केवल उस कॉल की अवधि के लिए बाहर निकलता है और इसके बाहर प्रचारित नहीं होता है। जब आप test से वापस आते हैं तो सूचक pt1 अस्तित्व में रहता है और किसी भी बदलाव की प्रतिलिपि नहीं बनाई जाती है।

साथ ही सूचक का एक अतिरिक्त "परत" का उपयोग कर की तरह आप pt2 के साथ किया था कभी कभी यह एक व्यापक दर्शकों के साथ करने के लिए "साझा" परिवर्तन वापसी मान का उपयोग करने के लिए उपयुक्त है:

#include <stdio.h> 
#include <stdlib.h> 

int *p = NULL; 
int *test(int * pt1, int**pt2){ 
    p = (int*)malloc(sizeof(int));  
    pt1 = p; 
    *pt2 = p; 
    printf("p points to %p\n", p); 
    printf("pt1 points to %p\n", pt1); 
    printf("pt2 points to %p\n", *pt2); 
    return pt1; 
} 

int main(void) { 
    int *p1 = NULL; 
    int *p2 = NULL; 

    printf("p points to %p\n", p); 
    printf("p1 points to %p\n", p1); 
    printf("p2 points to %p\n", p2); 

    p1=test(p1, &p2); 

    printf("p points to %p\n", p); 
    printf("p1 points to %p\n", p1); 
    printf("p2 points to %p\n", p2); 

    return 0; 
} 
+0

आपको बहुत बहुत धन्यवाद। मैं इसे अब समझता हूँ। – user2052197

1

आप मान द्वारा में p1 गुजर अरे, तो परिवर्तन है कि समारोह के दायरे के भीतर ही दिखाई दे रहे हैं। उस सूचक को एक पॉइंटर में पास करें, जैसा कि आपने पी 2 के साथ किया था, और आप ठीक हैं।

#include <stdio.h> 
#include <stdlib.h> 

int *p = NULL; 
void test(int **pt1, int**pt2){ 
    p = (int*)malloc(sizeof(int));  
    *pt1 = p; 
    *pt2 = p; 
    printf("p points to %p\n", p); 
    printf("pt1 points to %p\n", pt1); 
    printf("pt2 points to %p\n", *pt2); 
} 

int main(void) { 
    int *p1 = NULL; 
    int *p2 = NULL; 

    printf("p points to %p\n", p); 
    printf("p1 points to %p\n", p1); 
    printf("p2 points to %p\n", p2); 

    test(&p1, &p2); 

    printf("p points to %p\n", p); 
    printf("p1 points to %p\n", p1); 
    printf("p2 points to %p\n", p2); 

    return 0; 
} 
1

आप मान द्वारा p1 गुजर रहे हैं, तो यह main समारोह में अद्यतन नहीं है। हालांकि, आप संदर्भ द्वारा p2 पास कर रहे हैं (ध्यान दें कि आपने &p2 लिखा है), इसलिए इसे बदला जा सकता है।

+0

ओह, ऐसा लगता है कि 75inchpianist मुझे इसे हराया! – William