सरल सवाल ठीक हैं पर बात करने के लिए सेट कर रहे हैं, मुझे लगता है कि यह अच्छी तरह से स्थापित है कि इतने करने के लिए है सभी स्तरों के लिए, सिर्फ एक कुलीन नहीं।
सी में कोई null
नहीं है (जब तक कि आप इसे स्वयं परिभाषित न करें)। एक नल पॉइंटर को आरंभ किया जा रहा निम्नलिखित दो तरीकों में से एक में किया जा सकता है:
int *p = 0;
int *p = NULL;
आप p
उसके बाद भिन्नता, आप एक पहुँच उल्लंघन की आशा कर सकते हैं (मेरा मानना है कि यह मानक के अनुसार अपरिभाषित व्यवहार है, तो वास्तव में, कुछ भी हो सकता है, ब्रह्मांड के कुल विनाश तक और इसमें शामिल हो सकता है - यह भी ठीक चलना जारी रख सकता है, लेकिन मैं इस पर भरोसा नहीं करता)।
कोई वास्तविक पूर्णांक के लिए सूचक के लिए, बस का उपयोग करें:
int a = 7;
int *p = &a;
पते-के ऑपरेटर का उपयोग कर।
अपना संपादन पुनः पढ़ें, यह बिल्कुल अजीब नहीं है, आपको बस इसे देखने की आवश्यकता है। आइए दिखाएं कि सभी चर मेमोरी लोकेशन 100 से शुरू होते हैं और पूर्णांक और पॉइंटर्स लंबाई में 4 बाइट दोनों होते हैं। उनके सरलतम रूप के लिए अपने दो स्थितियों का विश्लेषण करना:
int x = 2;
int *px = 0; int *px = &x;
+-----+ +-----+
px(100): | 0 | x(100) | 2 |
+-----+ +-----+
px(104) | 100 |
+-----+
तो फिर तुम चर px
द्वारा की ओर इशारा बदल करने की कोशिश में आदेश पर अमल
*px = 7;
।
बाईं तरफ, आप स्मृति स्थान 0 पर मान 7 लिखने का प्रयास करेंगे।यह एक बुरी चीज है; बहुत कम सिस्टम आपको दुर्घटनाग्रस्त किए बिना ऐसा करने की अनुमति देंगे, यहां तक कि कम से कम किसी भी प्रतिकूल प्रभाव के बिना इसे अनुमति देगा (एचपी-यूएक्स के कुछ संस्करण वास्तव में ठीक काम करते हैं)।
दायीं तरफ होना चाहिए। px
से उठाया गया मान 100 है, इसलिए मान 7 उस स्मृति स्थान पर लिखा गया है, जिसका उद्देश्य x
बदलना है।
मुझे अक्सर चित्रों (यहां तक कि आदिम ASCII कलाएं भी मिलती हैं, क्योंकि मैं रूबेंस या बोटीसीली नहीं हूं) अवधारणाओं को स्पष्ट करने में मदद करता हूं। उम्मीद है कि यह आपके लिए थोड़ा सा साफ़ कर दिया गया है।
आपको क्रैश हो रहा है क्योंकि int * tmpPtr = 0; एक पूर्ण सूचक है और एक int युक्त स्मृति खंड में इशारा नहीं कर रहा है। आप मूल रूप से इस सूचक बिंदु को कुछ भी नहीं कह रहे हैं और आप उन पूर्णांकों की प्रतिलिपि नहीं बना सकते हैं जो मेमोरी स्पेस को उस स्थान पर ले जाते हैं जिसमें कोई स्थान नहीं है। int * tmpPtr = &tmp; आपके पॉइंटर पर tmp द्वारा कब्जा कर लिया गया स्मृति का पता निर्दिष्ट कर रहा है। यहां आप कह रहे हैं कि आपका पॉइंटर टीएमपी को आवंटित स्मृति पर इंगित करता है। अब, कॉपी वास्तव में उस स्थान में डेटा कॉपी कर सकती है क्योंकि आपका पॉइंटर उस चीज़ पर इशारा कर रहा है जिसका उपयोग वह कर सकता है। –
हां, जो तब पूर्ण ज्ञान बनाता है! विवरण के लिए आपका धन्यवाद! –