इसलिए हाल ही में कक्षा में, हमें पॉइंटर्स और हीप्स और वे कैसे काम करते हैं, से परिचित कराया गया। मेरे पास एक प्रश्न है कि हम cout उस सरणी में एक dereferenced सूचक क्यों नहीं कर सकते? उदाहरण के लिए, नीचे दिए गए कोड में:

#include <iostream>
using namespace std;

int main() {

    double* p = new double[2];
    *(p + 0) = 37.5;
    *(p + 1) = 101.4;

    for (int i = 0; i < 2; i++)
        cout << *p[i] << endl;

    return 0;

}

cout << *p[i] काम क्यों नहीं करता लेकिन cout << *(p + i) करता है?

0
BIank 23 अक्टूबर 2017, 19:57

4 जवाब

सबसे बढ़िया उत्तर

सी में, एक सरणी का नाम पहले तत्व के लिए एक सूचक है। सी ++ को सी से विरासत में मिला है। आपके प्रोग्राम में, पी सरणी के पहले तत्व का सूचक है। तो आप या तो पॉइंटर अंकगणित करते हैं जैसा आपने तत्वों को सेट करते समय किया था (उदाहरण *(p + 1) = 101.4;) या आप अंकगणित करने के लिए सबस्क्रिप्ट ऑपरेटर ([]) का उपयोग करते हैं: *(p + i) समान है पी [मैं]। कंपाइलर p [i] से 1 का अनुवाद करता है) i को p में जोड़ना और फिर 2) उस पते तक पहुँच प्राप्त करना जो योग से उत्पन्न हुआ था। आपने ठीक यही लिखा है: *(p + 1)। कोष्ठक में कथन की गणना पहले की जाती है और इस परिणाम पर संदर्भ ऑपरेटर लागू किया जाता है। यदि आप इसके बजाय इंडेक्स ऑपरेटर का उपयोग करते हैं तो ठीक यही होता है। तो आपके लूप को इस तरह दिखना है:

for (int i = 0; i < 2; i++)
{
 std::cout << p[i] << std::endl;
}

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

समझ गया?

पीएस .: और कृपया, अपने आप को एक एहसान करें और हमेशा के लिए / जबकि / अगर घुंघराले कोष्ठक के साथ बयानों के शरीर को घेरें। यह आपको बहुत समय बचाता है (विशेषकर अपनी बकवास डीबग करना)। मेरा विश्वास करो, यह सच है।

1
Lexi 23 अक्टूबर 2017, 20:26

p[1] = *(p + 1) यह वही है जो आप करना चाहते हैं। [] ऑपरेटर पहले से ही dereferences। *p[1] = *(*(p + 1)) यह एक डबल विच को हटाने की कोशिश करता है जो नहीं हो सकता

0
HangrY 23 अक्टूबर 2017, 20:12
cout << p[i]; 

आपकी अपेक्षा के अनुरूप काम करना चाहिए क्योंकि *p[i] मूल रूप से *(*(p + i)) है

मेरे लिए यहां पढ़ें https://www.tutorialspoint.com/cplusplus/cpp_pointer_arithmatic.htm http://www.learncpp.com /cpp-ट्यूटोरियल/6-8a-सूचक-अंकगणित-और-सरणी-अनुक्रमण/

0
inxoy 23 अक्टूबर 2017, 20:19

ध्यान दें कि p[i] *(p+i) के समान है। अब *p[i] अर्थहीन है, जब तक कि p[i] स्वयं किसी भिन्न स्थान की ओर संकेत न करे, उदा।

int t=0;

for(int i = 0; i < 2 ;i++)
   p[i] = &t;

cout << *p[i] << "is nothing but value of t" << endl;

मुझे आशा है कि यह स्पष्ट है।

-1
Akhilesh Siddhanti 23 अक्टूबर 2017, 20:06