"पॉइंटर्स का उद्देश्य आपको मैन्युअल रूप से स्मृति के ब्लॉक तक पहुंचने की अनुमति देना है।"
यह हमेशा सत्य नहीं होता है।
*(int*)(0x1234) = some_value;
यह "प्रत्यक्ष" स्मृति पहुंच है। हालांकि
int a = some_value, *ptr = &a;
*ptr = some_other_value;
आप अब a
परोक्ष रूप से तक पहुँच रहे हैं।
मैं, जहां मूल्य 5 संग्रहीत किया जाता है स्मृति के ब्लॉक का उपयोग करने के बाद से मैं चर का मूल्य बदल सकते जब भी मैं चाहता हूँ var = 6 चर 'var' उपयोग नहीं कर सकते; ?
निश्चित रूप से; लेकिन अर्थशास्त्र अलग है।
क्या मुझे वास्तव में एक सूचक की आवश्यकता है जब मैं अपने चर का उपयोग करके किसी भी चर के मूल्य का उपयोग करके केवल उस चरक का उपयोग कर सकता हूं जो उस पते को इंगित करता है जहां मूल्य संग्रहीत किया जाता है?
नहीं, आप नहीं करते हैं। पहले उदाहरण पर विचार करें: उस क्षेत्र के भीतर जहां a
घोषित किया गया है, ptr
के माध्यम से अपना मान संशोधित करना व्यर्थ है! हालांकि, यदि आप a
के दायरे में नहीं हैं तो क्या होगा? यही कारण है कि
void foo(int x)
{
x = 5;
}
int main(void)
{
int x = 10;
foo(x);
}
foo
में है, जब आप x = 5
करते हैं, वहाँ एक अस्पष्टता है: आप foo::x
या main::x
को संशोधित करना चाहते हैं? बाद के मामले में जिसे स्पष्ट रूप से "अनुरोध" किया जाना चाहिए और यह तथ्य जो पॉइंटर्स के माध्यम से होता है - या बेहतर, संकेत - एक संयोग और भाषा विकल्प है। अन्य भाषाओं में अन्य हैं।
महत्वपूर्ण धारणा [पॉइंटर एलियासिंग] (https://en.wikipedia.org/wiki/Pointer_aliasing) –
संबंधित है: http: // stackoverflow।कॉम/क्यू/27484168/694576 – alk
"पॉइंटर्स का उद्देश्य आपको मैन्युअल रूप से स्मृति के ब्लॉक तक पहुंचने की अनुमति देना है।" एक अजीब कथन का थोड़ा सा है; मैं उन स्थितियों के लिए पॉइंटर्स के लिए मुख्य उपयोग कहूंगा जहां आपके पास चर का नाम उपलब्ध नहीं है (उदाहरण के लिए पास-बाय-रेफरेंस को कार्यान्वित करना, या गतिशील रूप से आवंटित ऑब्जेक्ट्स तक पहुंचना, या बदलते इंडेक्स के साथ सरणी के सदस्य तक पहुंच) –