2011-08-18 15 views
10

मुझे पता है कि यह कई बार खत्म हो गया है, लेकिन मैं आज एक मामले में आया हूं जो पॉइंटर गणित/सरणी सूचकांक की मेरी समझ को हिलाता है।पॉइंटर गणित बनाम ऐरे इंडेक्स

जैसा कि मैंने इसे सब कुछ समझा है, & mybuff [10] और (mybuff + 10) एक ही स्मृति को संदर्भित करने के समतुल्य तरीके हैं।

memcpy(&mybuff+10,&in,8); 

बफर, सीमा से जब पर अनुकूलन के साथ संकलित और काम ठीक जब डिबगिंग के लिए संकलित:

हालांकि मैं सुबह एक मामले में जहां लड़ बिताया।

जबकि athe एक ही समय,

memcpy(&mybuff[10],&in,8); 

दोनों ही मामलों में ठीक काम किया।

किसी भी विचार या पॉइंटर्स के लिए बहुत धन्यवाद।

+10

"पॉइंटर्स" – Daniel

+9

[कुछ पॉइंटर्स] (http://xkcd.com/138/) के लिए पूछने वाले पून पर टी हे। – mopsled

+1

'और mybuff [10]' 'और (* (mybuff + 10)) का मूल्यांकन करता है, जो' और mybuff + 10' से अलग है। याद रखें कि '[]' जैसे पोस्टफिक्स ऑपरेटरों को '&' जैसी यूनरी ऑपरेटरों की तुलना में अधिक प्राथमिकता है। –

उत्तर

1

सही सिंटैक्स mybuff+10&mybuff+10 नहीं जो करने के लिए ले जाने के का कहना है की तरह के लिए http://cplusplus.com/doc/tutorial/operators/ देखना अपनी सरणी में स्थिति 10 और 8 बाइट कॉपी करें (प्रति आप आर memcpy कथन)। यह अभी भी अज्ञात है कि क्या आप वास्तव में अतिरिक्त 8 बाइट्स रख सकते हैं।

+0

क्या सिरेक्स के लिए सही ??? – user12861

+0

@ user12861: यहां जाएं - http://www.learncpp.com/cpp-tutorial/68-pointers-arrays-and-pointer-arithmetic/ –

+0

मैं कह रहा हूं कि यह उत्तर स्पष्ट नहीं है। निजी तौर पर, मुझे कम से कम यह सी ++ पता है। – user12861

2

मुझे लगता है कि आपको कुछ पॉइंटर समस्याएं हैं।
यदि Mybuff एक सूचक है तो mybuff + 10 == &(mybuff[10])
यह &mybuff + 10 जैसा नहीं है जैसा आप वहां गए हैं।

6

मैं उदाहरण के लिए mybuff के लिए एक घोषणा आविष्कार करेंगे:

char mybuff[123]; 

अब, &mybuff+10 सूचक &mybuff पर arithmic, जो प्रकार "123 वर्ण की सरणी के लिए सूचक" है नहीं करता है। यह अलग सादे mybuff से है (पॉइंटर क्षय के बाद) "पॉइंटर टू char" टाइप किया गया है। इन दो अभिव्यक्तियों का थोड़ा सा मूल्य समान है, लेकिन क्योंकि वे विभिन्न आकारों की चीजों के संकेतक हैं, वे पॉइंटर अंकगणितीय के तहत अलग-अलग व्यवहार करते हैं।

&mybuff+10 का अर्थ है कि आप इस प्रकार के 123-चार सरणी (जो घोषणापत्र और अर्थात् सीगफॉल्ट दिया गया है) के पिछले दस कदमों को चरणबद्ध करना चाहते हैं, जबकि mybuff+10 बस कहता है कि आप पिछले दस अलग-अलग वर्णों को चरणबद्ध करना चाहते हैं।

2

(&mybuff+10) और &mybuff[10]नहीं बराबर हैं, किंतु &mybuff[10] और mybuff + 10 हैं।

+0

काफी नहीं; 'और mybuff [10]' parses 'और (mybuff [10])', जिसका मूल्यांकन '& (* (mybuff + 10)) के रूप में किया जाता है। –

+0

जो 'mybuff + 10' के बराबर है। –

+0

बस हमारे उत्तर की पहली पंक्ति को हटाएं या संपादित करें, क्योंकि यह शुरुआती – xitx

4

&mybuff[10]&mybuff[0] + 10 जो mybuff + 10

सरणी अनुक्रमण के बराबर सूचक अंकगणित के संदर्भ में परिभाषित किया गया है है के बराबर है। p[i] का अर्थ है *(p+i) (p या i मामले में अतिरिक्त कोष्ठक की आवश्यकता को अनदेखा कर रहा है, p एक सूचक मूल्य है और i एक पूर्णांक मान है।

ट्रिविया: चूंकि इसके अलावा, पॉइंटर + पूर्णांक अतिरिक्त, कम्यूटिव है, p[i] को i[p] के रूप में भी लिखा जा सकता है। हां, 4["Hello"] == 'o'। भविष्य में अपना कोड पढ़ने वाले किसी भी व्यक्ति के लिए, कृपया इस ज्ञान का उपयोग करें।

सी (और सी ++, जहां नियम लगभग समान हैं) में सरणी और सूचक के बीच संबंधों पर एक उत्कृष्ट संदर्भ comp.lang.c FAQ की धारा 6 है। (मैं सीधे अनुभाग 6 से लिंक कर सकता था, लेकिन मैं इसे ब्राउज़ करने के लिए लोगों को प्रोत्साहित करना चाहता हूं; पूरी बात पढ़ने योग्य है।)

1

डीबग मोड में काम करने का कारण यह है कि डीबग मोड में, स्मृति के लिए प्रारंभ किया गया है आप और आवंटन वास्तविक आकार से भी बड़े हैं। http://msdn.microsoft.com/en-us/library/bebs9zyz(v=vs.80).aspx

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