2011-05-03 3 views
5

printf() को कॉल करते समय * बी का मान अनिश्चित है? a रूप में एक ही स्मृति मेंसूचकांक के लिए सूचक और सामान्य सूचक मिश्रित किया जा सकता है?

void foo(int *a) { 
    const int *b = a; 
    int *c = a; 
    *c = 2; 
    printf("%d\n", *b); // what must be *b? 1, 2 or undefined? 
} 

int d = 1; 
foo(&d); 

उत्तर

11

यह प्रिंट होगा 2. const int *b का शाब्दिक अर्थ है: जिसका मूल्य अपने dereferentiation के माध्यम से परिवर्तित नहीं किया जा सकता है एक पूर्णांक के लिए

सूचक।

इसका मतलब यह नहीं है कि पॉइंटर पॉइंट्स का मूल्य बदल नहीं सकता है। वास्तव में यह बदलने के लिए पूरी तरह से मान्य है। इसका उपयोग करने के लिए एक संभावित परिदृश्य, संरचनाएं हैं जो केवल कुछ बड़ी संरचना के संदर्भ को पढ़ती हैं। संदर्भ बदल सकता है, लेकिन उस संरचना के साथ काम करने वाले फ़ंक्शंस पॉइंटर के पीछे क्या नहीं बदल सकते हैं।

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

+0

बहुत ठोस स्पष्टीकरण, आपको इस तथ्य के बारे में सोचना होगा कि पॉइंटर ऑब्जेक्ट स्वयं ही एक पता है। –

+0

यह मेरा मामला था: डेटा के लिए कॉन्स्टेंट करने के लिए पॉइंटर के रूप में परिभाषित एक स्ट्रक्चर में एक आइटम जिसे अन्य कार्यों द्वारा बदला जा सकता है। यह मेरा पहला समय है, सभी जवाब बहुत तेज़ थे! – misianne

+0

@misianne: दरअसल शब्द "कॉन्स्ट" शब्द पॉइंटर्स के साथ इस तरह इस्तेमाल किया जाता है, यह थोड़ा भ्रामक है क्योंकि आपको कॉन्स-नेस (अपरिवर्तनीयता) लगता है जबकि वास्तव में यह "पठनीय" जैसा है। मुख्य बिंदु यह है कि जब आप कहते हैं कि 'const int * p' आप ** सूचक ** के बारे में कुछ बता रहे हैं (यानी कि इसे लिखने के लिए उपयोग नहीं किया जा सकता है), ** पॉइंट ऑब्जेक्ट ** के बारे में नहीं (जो कि नहीं हो सकता बिल्कुल स्थिर)। – 6502

0

b के बाद से अंक, मूल्य पाठ्यक्रम परिवर्तन की होगी। निश्चित नहीं है कि आपने c भी क्यों पेश किया, लेकिन यह कुछ भी नहीं जोड़ता है। यह 2 प्रिंट करेगा।

+0

भले ही बी बीएस है और सी नहीं है? – BlackBear

0

*b 2 होगा क्योंकि printf से पहले की अंतिम पंक्ति *c = 2 है।

a, b, और c सभी एक ही पूर्णांक मान को इंगित करते हैं। तो इसे सेट करने वाला आखिरी वाला अपना वर्तमान मूल्य निर्धारित करेगा।

0

बी printf() में 2 होना चाहिए। आप बी और सी में हर समय एक सूचक को संभालते हैं।

0

घोषणा const int *b = a; का अर्थ है कि b एक निरंतर int मान को संदर्भित करता है। यह कहना है कि यह अपने मूल्य को निरंतर मूल्य के रूप में मानता है।

इस प्रकार,

*b = 10; 

गलत है, लेकिन:

a = 10; 

ठीक बाद से एक एक निरंतर मूल्य नहीं है, लेकिन जब ख अपसंदर्भन हम इसे के रूप में लगातार इलाज है।

तो b निश्चित रूप से परिभाषित किया गया है जब से तुम मूल्य यह की ओर इशारा किया बदल दिया है:

c = 2; 

जो ऊपर के उदाहरण के रूप में ही है। सीधे शब्दों में कहें, एक कॉन्स वैल्यू के लिए पॉइंटर डीरफ्रेंसिंग के माध्यम से मान को संशोधित नहीं कर सकता है, लेकिन जो मान इंगित करता है वह अन्यथा बदला जा सकता है।

2

स्टैंडर्ड क्या कहते हैं (जोर मेरा है)

6,7 है।3/5

एक प्रयास एक वस्तु गैर स्थिरांक योग्य प्रकार वाला lvalue के उपयोग के माध्यम एक स्थिरांक योग्य प्रकार के साथ परिभाषित संशोधित करने के लिए किया जाता है, व्यवहार अनिर्धारित रहता है।

यह आपकी स्थिति (केवल दूसरी तरफ) पर लागू नहीं होता है।
प्रश्न में वस्तु को सादे (int) प्रकार के साथ परिभाषित किया गया था।

आपकी स्थिति में केवल b के माध्यम से ऑब्जेक्ट में परिवर्तन अवैध हैं; a या c के माध्यम से परिवर्तन पूरी तरह से कानूनी हैं

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