इसलिए हाल ही में कक्षा में, हमें पॉइंटर्स और हीप्स और वे कैसे काम करते हैं, से परिचित कराया गया। मेरे पास एक प्रश्न है कि हम 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)
करता है?
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]) हो जाता है। तो यह कथन सरणी से डबल रीड को एक पते के रूप में उपयोग करने का प्रयास करता है जिसे एक्सेस किया जाएगा। यह संभव नहीं है, यह स्पष्ट है (उम्मीद है)।
समझ गया?
पीएस .: और कृपया, अपने आप को एक एहसान करें और हमेशा के लिए / जबकि / अगर घुंघराले कोष्ठक के साथ बयानों के शरीर को घेरें। यह आपको बहुत समय बचाता है (विशेषकर अपनी बकवास डीबग करना)। मेरा विश्वास करो, यह सच है।
p[1] = *(p + 1)
यह वही है जो आप करना चाहते हैं। [] ऑपरेटर पहले से ही dereferences। *p[1] = *(*(p + 1))
यह एक डबल विच को हटाने की कोशिश करता है जो नहीं हो सकता
cout << p[i];
आपकी अपेक्षा के अनुरूप काम करना चाहिए क्योंकि *p[i]
मूल रूप से *(*(p + i))
है
मेरे लिए यहां पढ़ें https://www.tutorialspoint.com/cplusplus/cpp_pointer_arithmatic.htm http://www.learncpp.com /cpp-ट्यूटोरियल/6-8a-सूचक-अंकगणित-और-सरणी-अनुक्रमण/
ध्यान दें कि 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;
मुझे आशा है कि यह स्पष्ट है।
संबंधित सवाल
नए सवाल
c++
C ++ एक सामान्य-प्रयोजन प्रोग्रामिंग भाषा है। यह मूल रूप से C के विस्तार के रूप में डिज़ाइन किया गया था और इसमें एक समान सिंटैक्स है, लेकिन यह अब पूरी तरह से अलग भाषा है। C ++ कंपाइलर के साथ संकलित कोड के बारे में प्रश्नों के लिए इस टैग का उपयोग करें। विशिष्ट मानक संशोधन [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] या [C ++ 23], आदि से संबंधित प्रश्नों के लिए संस्करण-विशिष्ट टैग का उपयोग करें। ।