क्या N PULL को C पॉइंटर इनिशियलाइज़ करना संभव है?
टीएल; डीआर हाँ, बहुत।
वास्तविक गाइड पर किए गए दावे की तरह पढ़ता है
दूसरी ओर, यदि आप केवल एकल प्रारंभिक असाइनमेंट का उपयोग करते हैं int *my_int_ptr = 2;
, तो प्रोग्राम my_int_ptr
2 द्वारा बताए गए मेमोरी लोकेशन की सामग्री को भरने का प्रयास करेगा । 2 क्योंकि my_int_ptr
कचरा भरा हुआ है, इसलिए यह कोई भी पता हो सकता है। [...]
खैर, वे कर रहे हैं गलत है, तो आप सही हैं।
बयान के लिए, ( अब के लिए, इस तथ्य को अनदेखा करना, कि पूर्णांक रूपांतरण के लिए सूचक एक कार्यान्वयन-परिभाषित व्यवहार है )
int * my_int_ptr = 2;
my_int_ptr
एक वैरिएबल (टाइप पॉइंटर से int
) है, इसका अपना एक पता है (टाइप: पॉइंटर से पूर्णांक तक का पता), आप उस एड्रेस 2
में एक वैल्यू स्टोर कर रहे हैं ।
अब, my_int_ptr
, एक सूचक प्रकार किया जा रहा है, हम इसे कह सकते हैं, की ओर इशारा करता स्मृति स्थान पर "प्रकार" का मान द्वारा बताया में आयोजित मूल्य my_int_ptr
। तो, आप अनिवार्य रूप से पॉइंटर वैरिएबल का मान असाइन कर रहे हैं , न कि पॉइंटर द्वारा बताई गई मेमोरी लोकेशन की वैल्यू।
तो, निष्कर्ष के लिए
char *x=NULL;
पॉइंटर वैरिएबल x
को इनिशियलाइज़ करता है NULL
, न कि पॉइंटर द्वारा बताए गए मेमोरी एड्रेस पर वैल्यू ।
यह भी ऐसा ही है
char *x;
x = NULL;
विस्तार:
अब, कड़ाई से अनुरूप, एक बयान की तरह
int * my_int_ptr = 2;
अवैध है, क्योंकि इसमें बाधा उल्लंघन शामिल है। स्पष्ट होना,
my_int_ptr
एक सूचक चर है, टाइप करें int *
- एक पूर्णांक निरंतर,
2
प्रकार है int
परिभाषा के द्वारा,।
और वे "संगत" प्रकार नहीं हैं, इसलिए यह आरंभीकरण अमान्य है क्योंकि यह सरल असाइनमेंट के नियमों का उल्लंघन कर रहा है, जिसका उल्लेख लुंडिन के उत्तर में वर्णित अध्याय .16.5.16.1 / P1 में किया गया है ।
यदि किसी की दिलचस्पी इस बात से है कि आरंभीकरण कैसे सरल असाइनमेंट की कमी से जुड़ा है, तो उद्धृत करना C11
, अध्याय §6.7.9, P11
एक स्केलर के लिए इनिशलाइज़र एक एकल अभिव्यक्ति होगी, वैकल्पिक रूप से ब्रेसिज़ में संलग्न होगी। वस्तु का प्रारंभिक मूल्य अभिव्यक्ति (रूपांतरण के बाद) है; साधारण असाइनमेंट के लिए एक ही प्रकार की बाधाएं और रूपांतरण लागू होते हैं, स्केलर के प्रकार को इसके घोषित प्रकार के अयोग्य संस्करण के रूप में लेते हैं।
int *x = whatever;
करता है और क्याint *x; *x = whatever;
करता है के बीच एक बहुत भ्रामक अंतर है।int *x = whatever;
वास्तव में जैसा व्यवहार करता हैint *x; x = whatever;
, वैसा नहीं*x = whatever;
।