मुझे हाल ही में एक सी प्रोग्रामिंग शुरुआत की ओर इशारा करने वाले लोगों को समझाने में खुशी हुई है और निम्नलिखित कठिनाई पर ठोकर खाई है। यह एक समस्या की तरह प्रतीत नहीं हो सकता है यदि आप पहले से ही संकेत का उपयोग करना जानते हैं, लेकिन एक स्पष्ट उदाहरण के साथ निम्नलिखित उदाहरण को देखने की कोशिश करें:
int foo = 1;
int *bar = &foo;
printf("%p\n", (void *)&foo);
printf("%i\n", *bar);
निरपेक्ष शुरुआत करने के लिए आउटपुट आश्चर्यजनक हो सकता है। पंक्ति 2 में उसने सिर्फ * बार को & फू होने की घोषणा की थी, लेकिन पंक्ति 4 में यह पता चलता है कि बार वास्तव में & foo के बजाय फू है!
भ्रम, आप कह सकते हैं, * प्रतीक की अस्पष्टता से उपजा है: पंक्ति 2 में इसका उपयोग सूचक को घोषित करने के लिए किया जाता है। पंक्ति 4 में इसका उपयोग एक अपर संचालक के रूप में किया जाता है जो सूचक बिंदुओं पर मान प्राप्त करता है। दो अलग बातें, है ना?
हालाँकि, यह "स्पष्टीकरण" एक शुरुआत में मदद नहीं करता है। यह एक सूक्ष्म विसंगति को इंगित करके एक नई अवधारणा का परिचय देता है। यह इसे सिखाने का सही तरीका नहीं हो सकता।
तो, कार्निघन और रिची ने इसे कैसे समझाया?
यूनिरी ऑपरेटर * अप्रत्यक्ष या डीफ्रेन्सिंग ऑपरेटर है; जब एक पॉइंटर पर लागू किया जाता है, तो यह पॉइंटर पॉइंटर को ऑब्जेक्ट को एक्सेस करता है। [...]
सूचक आईपी की घोषणा,
int *ip
एक महामारी के रूप में इरादा है; यह कहता है कि अभिव्यक्ति*ip
एक इंट है। एक चर के लिए घोषणा का वाक्यविन्यास अभिव्यक्तियों का वाक्यविन्यास नकल करता है जिसमें चर दिखाई दे सकता है ।
int *ip
पढ़ा जाना चाहिए जैसे " *ip
लौट आएंगे int
"? लेकिन घोषणा के बाद उस पैटर्न का पालन क्यों नहीं किया जाता है? क्या होगा अगर एक शुरुआती चर को शुरू करना चाहता है? int *ip = 1
(पढ़ें: *ip
वापसी करेगा int
और int
है 1
) उम्मीद के मुताबिक काम नहीं करेगा। वैचारिक मॉडल सिर्फ सुसंगत नहीं लगता है। क्या मुझसे कोई चूक हो रही है?
संपादित करें: इसने यहां उत्तरों को संक्षेप में प्रस्तुत करने का प्रयास किया ।
*
एक घोषणा में एक टोकन अर्थ है "एक पॉइंटर घोषित करें", अभिव्यक्ति में यह अनुमेय ऑपरेटर है, और ये दोनों अलग-अलग चीजों का प्रतिनिधित्व करते हैं जो एक ही प्रतीक के लिए होते हैं। (समान गुणक ऑपरेटर के समान - एक ही प्रतीक, अलग अर्थ)। यह भ्रामक है, लेकिन मामलों की वास्तविक स्थिति से अलग कुछ और भी बदतर होने जा रहा है।
int* bar
स्पष्ट हो जाता है कि तारा वास्तव में प्रकार का हिस्सा है, पहचानकर्ता का हिस्सा नहीं है। बेशक यह आपको अलग-अलग समस्याओं में चलाता है जैसे कि अनजाने सामान int* a, b
।
*
संदर्भ के आधार पर दो अलग-अलग अर्थ हो सकते हैं। जैसे एक ही अक्षर का अलग-अलग तरह से उच्चारण किया जा सकता है, यह उस शब्द पर निर्भर करता है, जिसमें कई भाषाओं को बोलना सीखना मुश्किल हो जाता है। यदि हर एक अवधारणा / ऑपरेशन का अपना प्रतीक होता है तो हमें बहुत बड़े कीबोर्ड की आवश्यकता होती है, इसलिए जब ऐसा करने के लिए प्रतीक को पुनर्नवीनीकरण किया जाता है।
int* p
), अपने छात्र को एक ही पंक्ति में कई घोषणाओं का उपयोग करने के खिलाफ चेतावनी देते हुए जब संकेत शामिल होते हैं। जब छात्र बिंदुओं की अवधारणा को पूरी तरह से समझ गया है, तो छात्र को समझाएं कि int *p
वाक्यविन्यास समान है और फिर कई घोषणाओं के साथ समस्या को समझाएं।