2013-04-15 9 views
5

टिप्पणी के साथ लाइन का जिक्र करते हुए:किसी सरणी को पॉइंटर को संदर्भित करना?

  • क्यों उदाहरण के काम में कोष्ठक जोड़ने सरणी की सभी सामग्री मुद्रित करने के लिए करता है?

उदाहरण "एक" प्रिंट करता है, फिर कचरा प्रिंट करता है।

#include <iostream> 

int main() { 
    const char* a[3] = { "one", "two", "three" }; 
    const char*(*p)[3] = &a; 
    for(int i = 0; i < 3; i++) { 
     std::cout << *p[i] << std::endl; // this line 
    } 
    return 0; 
} 

यह इस करने के लिए बदलने के बाद काम करता है:

std::cout << (*p)[i] << std::endl; 

उत्तर

16

p इस तरह 3 तत्वों की एक सरणी के लिए सूचक है।

अभिव्यक्ति *p[i] ऑपरेटर पूर्वता (जो *(*(p + i)) के बराबर है) की वजह से *(p[i]) माना जाता है। इसका मतलब है कि आप सरणी में सूचक को अनुक्रमणित कर रहे हैं। आप p[1] करते हैं, उदाहरण के लिए, आप सूचक "अगले" सरणी और प्रयास के साथ यह भिन्नता को स्थानांतरित:

┌─────┬─────┬─────┐ 
│  │  │  │ 
└─────┴─────┴─────┘ 
        ^
        └─ p + 1 

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

┌─────┬─────┬─────┐ 
│  │  │  │ 
└─────┴─────┴─────┘ 
^
    └─ *p 

इस मामले में, सूचक सरणी तत्व और नहीं पूरे सरणी पर इंगित कर रहा है। यदि आप तो सूचकांक, उदाहरण के लिए, (*p)[1] के लिए, आप प्राप्त करेंगे:

┌─────┬─────┬─────┐ 
│  │  │  │ 
└─────┴─────┴─────┘ 
     ^
     └─ (*p) + 1 

यह आप एक वैध const char* जो तब cout द्वारा outputted किया जा सकता है देता है।

+0

ग्रेट उत्तर। मुझे एहसास नहीं हुआ कि बढ़ते हुए मैं एक और पूरी सरणी को अपमानित करने की कोशिश करता हूं, हालांकि मुझे ऑपरेटर प्राथमिकता के बारे में पता था। मुझे एक सूचक होने की सरणी की मानसिकता में फंस जाना चाहिए। – thelittlegumnut

6

Operator precedence. बिना () ऑपरेटर [] पहले बुलाया जाएगा और इसका परिणाम dereferenced होगा: तो देखने के compilers बिंदु से यह वास्तव में है

सरणी चयन, भिन्नता की तुलना में अधिक पूर्वता है। () के साथ - सबसे पहले dereference होगा और फिर ऑपरेटर [] पर कॉल करें।

┌─────┬─────┬─────┐ 
│  │  │  │ 
└─────┴─────┴─────┘ 
^
    └─ p 

ध्यान दें कि यह पूरे सरणी, नहीं इसके बारे में एक भी तत्व में बताते हैं:

1
 #include <iostream> 
     using namespace std;  

     int main() { 


      int arr[5] = {1,2,3,4,5}; 

      int *p=arr; 


      int intgerSize=sizeof(int); 


      for(int k=0;k<5;k++) 


      { 
       cout<<"arr ["<<k<<"] "<<*(p+(k*sizeof(int)/intgerSize)); 
       cout<<" "<<(p+(k*sizeof(int)/intgerSize)); 
       cout<<" "<<p+k<<"\n"; 

      }`enter code here` 

      return 0; 
     } 
OUTPUT:- 
arr [0] 1 0x7ffd180f5800 0x7ffd180f5800 
arr [1] 2 0x7ffd180f5804 0x7ffd180f5804 
arr [2] 3 0x7ffd180f5808 0x7ffd180f5808 
arr [3] 4 0x7ffd180f580c 0x7ffd180f580c 
arr [4] 5 0x7ffd180f5810 0x7ffd180f5810 
+0

उपरोक्त कोड –

+0

स्टैक ओवरफ़्लो, @ankitgupta में आपका स्वागत है। चूंकि प्रश्न और उत्तर सहेजे जाते हैं और न केवल प्रश्न पूछने वाले व्यक्ति की सहायता के लिए संसाधन के रूप में कार्य करते हैं, यह समझना उपयोगी होता है कि यह कोड प्रश्नकर्ता के मुद्दे को कैसे/क्यों संबोधित करता है।अतिरिक्त जानकारी शामिल करने के लिए आप अपना उत्तर संपादित कर सकते हैं। आप समीक्षा करना चाह सकते हैं: https://stackoverflow.com/help/how-to-answer – Degan

+0

उपरोक्त कोड आपको यह जानने में मदद करेगा कि कंपाइलर आंतरिक रूप से सरणी को कैसे संभालता है। –

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