2009-04-17 28 views
12

पर विचार करें निम्नलिखित कोड टुकड़ा:सूचक अंकगणित सी में

int (*p)[3]; 
int (*q)[3]; 

q = p; 
q++; 
printf("%d, %d\n", q, p); 
printf("%d\n", q-p); 

मुझे पता है कि सूचक अंकगणित बुद्धिमान है, जिसका अर्थ है कि आपरेशन q++ अग्रिम q पर्याप्त बाइट्स आगे एक अगले 3-पूर्णांक सरणी को इंगित करने के, तो यह मुझे आश्चर्य नहीं है कि पहले प्रिंट जिसका अर्थ है कि incrementing q यह 12.

में बड़ा किया लेकिन दूसरे प्रिंट मुझे तो हैरानी करता है '12, 0'। यह 1 प्रिंट करता है!
तो यह 12 के बजाय 1 क्यों प्रिंट करेगा? यह सिर्फ मुझे पहेली करता है।

उत्तर

27

++ वृद्धि ऑपरेटर की तरह, - पॉइंटर्स के साथ घटाव ऑपरेटर भी ध्यान देने योग्य वस्तुओं के आकार को ध्यान में रखता है। विशेष रूप से, परिणाम लौटाया गया पॉइंट मानों में बाइट्स अंतर की संख्या इंगित की गई वस्तु के आकार (12, आपके उदाहरण में) के आकार से विभाजित होती है। तो अंतर 12 बाइट्स है, आकार 12, या 1.

+0

तो दो पॉइंटर्स लेने और बाइट्स में अपना अंतर पाने का कोई तरीका नहीं है? –

+8

पॉइंटर्स को (char *) पर कास्ट करें, तो आपको बाइट्स में अंतर मिलेगा। –

+4

@Leif: या बस आकार (your_type) द्वारा अंतर को गुणा करें। –

4

यदि आप वास्तव में अंतर को जानना चाहते हैं तो प्रत्येक पॉइंटर्स को (char *) और फिर (int) और फिर घटाएं। आपको जवाब देना चाहिए।

इस कोड को आप निरपेक्ष मान देता है:

printf("%d\n", abs((int)((char*)q) - (int)((char*)p))); 

math.h. शामिल करना न भूलें

संपादित करें: जैसा कि एक टिप्पणी में बताया गया है कि हमें डबल कास्ट की आवश्यकता नहीं है। प्रत्येक पॉइंटरपोइंटर को एक int में कास्ट करना और फिर घटाकर उपरोक्त (अनावश्यक) डबल कास्टिंग के समान उत्तर देता है।

printf("%d\n", abs((int)(q) - (int)(p))); 
+0

डबल-कास्ट क्यों? –

+0

अगर आकार (int) Idelic

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