2014-06-16 6 views
6

किसी सरणी के लिए पॉइंटर का उपयोग करते समय, मैंने हमेशा इंडेक्सर का उपयोग करके तत्वों का उपयोग किया है, जैसे myPtr[i] = stuff; हालांकि, मैं हाल ही में BitConverter's implementation पर देख रहा था और पाया कि तत्वों को *(myPtr + i) = stuff करके एक्सेस किया गया था।पीआरटी [i] और * (पीआरटी + i) के बीच क्या अंतर है?

जो मैंने सोचा था कि काफी अजीब था, क्योंकि दोनों विधियों (जो मुझे पता है) वही काम करते हैं, यानी, वे myPtr + i का पता वापस लेते हैं, सिवाय इसके कि वे (मेरी राय में) इंडेक्सर विधि अधिक पठनीय दिखती है।

तो माइक्रोसॉफ्ट ने पॉइंटर्स को बढ़ने का तरीका क्यों चुना, दोनों तरीकों के बीच क्या अंतर है (क्या प्रदर्शन लाभ हैं)?

+0

वे एक ही आईएल उत्पन्न करते हैं। यह सिर्फ शैली का मामला है। –

+0

'ToBoolean' विधि बहुत अच्छी है। टिप्पणियां कोड से मेल नहीं खाती हैं, और इसमें महान 'x == 0 है? झूठा: सादा 'x! = 0' का उपयोग करने के बजाय सही 'पैटर्न। – CodesInChaos

उत्तर

4

जैसा कि आपने कहा है, वे वही काम करते हैं।

वास्तव में, जब एक int* एक्सेस करते समय, दोनों ptr[i] और *(ptr + i) वाक्यविन्यास सीमा जाँच बिंदु कुछ स्मृति को सरणी सीमा के बाहर छोड़ देगा, और अगर i सरणी की लंबाई से अधिक है।

मुझे यकीन है कि सी #, साथ ही सी ++, सी से *(ptr + index) वाक्यविन्यास का उपयोग करके एक सरणी सूचक में अनुक्रमित पहुंच को विरासत में मिला है। मुझे पूरा यकीन है कि दोनों सिंटैक्स उपलब्ध क्यों हैं।

+0

तो 'myPrt [i] 'सिर्फ वाक्य रचनात्मक चीनी है? इसके अलावा कोई और अंतर नहीं है? – Sam

+0

@ सैम हाँ, कोई और अंतर नहीं होना चाहिए। – dcastro

+0

@dcastro जहां तक ​​मुझे याद है, एक इंडेक्सर का उपयोग करके आप 'इंडेक्सऑटऑफेंजेंज अपवाद' दे सकते हैं, जबकि '* (पीआरटी + इंडेक्स) 'आपको केवल सरणी के बाहर कुछ मेमोरी पर इंगित करेगा। – AndreySarafanov

1

[] एरे और पॉइंटर (जो डैक्रो के उत्तर के तहत चर्चा की गई) के ऑपरेटर के बीच अंतर को स्पष्ट करने के लिए, आप नीचे दिए गए कोड का आउटपुट देख सकते हैं।

unsafe { 
    int[] arr = new[] { 1, 2 }; 
    fixed(int* ptr = arr) { 
     for(int i = 0; i < arr.Length + 1; i++) { 
      try { System.Console.WriteLine(*(ptr + i)); } catch(Exception e) { System.Console.WriteLine(e.Message); } 
      try { System.Console.WriteLine(ptr[i]); } catch (Exception e) { System.Console.WriteLine(e.Message); } 
      try { System.Console.WriteLine(arr[i]); } catch (Exception e) { System.Console.WriteLine(e.Message); } 
     } 
    } 
} 

आउटपुट

1 
1 
1 
2 
2 
2 
0 
0 
Index was outside the bounds of the array. 
2

से CSharp Language Specification (18.5.3):

प्रपत्र पी [ई] का एक सूचक तत्व पहुँच * के रूप में वास्तव में मूल्यांकन किया जाता है (पी + ई) । (...) पॉइंटर तत्व एक्सेस ऑपरेटर आउट-ऑफ-बाउंड त्रुटियों की जांच नहीं करता है और आउट-ऑफ-बाउंड तत्व तक पहुंचने पर व्यवहार अपरिभाषित होता है। यह सी और सी ++ के समान है।

कोई अंतर नहीं है।

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