2012-03-24 9 views

उत्तर

17

पहले, सूचक अंकगणित जब असंबंधित संकेत पर प्रदर्शन परिभाषित नहीं है।

दूसरा, यह समझ में आता है। पॉइंटर्स को घटाते समय आपको उन पतों के बीच तत्वों की संख्या मिलती है, बाइट्स की संख्या नहीं।

आपको लगता है कि

char *p1 = &i, *p2 = &j; 

साथ आप एक अलग परिणाम मिलेगा कोशिश करना हो तो।


एक साइड नोट के रूप में, प्रिंटिंग पॉइंटर्स के दौरान %p का उपयोग करें।

+0

कड़ाई से बोलना यह सच है, लेकिन मैंने जो भी कार्यान्वयन किया है, वह "सही चीज़" है। तो ओपी वास्तव में करता है। –

+0

@CarlNorum Yup, मैंने संपादित किया। – cnicutar

+0

समझ गया। धन्यवाद! – Ava

2

कड़ाई से बोलते हुए, आपका प्रोग्राम कुछ प्रकार के अपरिभाषित व्यवहार का कारण बनता है, पहले असंबद्ध पॉइंटर्स पर पॉइंटर अंकगणित के कारण, और उसके बाद आपके प्रिंट स्टेटमेंट में मिलान किए गए प्रारूप स्ट्रिंग और तर्कों के कारण। हालांकि, भले ही उन्हें सही किया गया हो, आप एक ही परिणाम देखेंगे। अंतर 1 है क्योंकि सूचक अंकगणित प्रकार के आकार की इकाइयों में परिणाम देता है - आपके मामले में int एक 4-बाइट प्रकार है, इसलिए 412 बाइट्स को इंगित करने वाले int * पॉइंटर्स को घटाकर 1.

का परिणाम मिलता है
6

जैसा कि अन्य ने कहा है, परिणाम आपको प्राप्त करने वाले पॉइंटर्स के प्रकार के आकार के एक से अधिक में है। उन्हें चार पॉइंटर्स बनने के लिए कास्ट करें और परिणाम आपको बाइट्स के मामले में होगा। इसके अलावा, आपको ptrdiff_t type का उपयोग करना चाहिए, ताकि 64-बिट पॉइंटर्स वाले सिस्टम पर प्रकार को परिणाम रखने के लिए पर्याप्त होना चाहिए।

ptrdiff_t c = (char*)p - (char*)q; 

भी ध्यान रखें कि कि एक ही सरणी में नहीं हैं दो मानों के पते का अंतर लेने मानक में अपरिभाषित है, लेकिन के बारे में हर सिस्टम पर काम करता है।

+0

जब मैं कोशिश करता हूं तो मुझे पॉइंटर्स पर अंकगणित के लिए त्रुटि मिलती है। –

+0

'शून्य *' पॉइंटर्स पर अंकगणित है [गैर मानक व्यवहार] (https://stackoverflow.com/a/3524270/1289657) केवल कुछ कंप्रेसर (आउट) कुछ झंडे के साथ समर्थित है। मैंने उत्तर को केवल 'char *' पॉइंटर्स की सिफारिश करने के लिए बदल दिया है, जो सही तरीके से काम करता है और मानक व्यवहार है। – AgentME