2016-01-07 7 views
6

पर कोई पता निर्दिष्ट करना चाहता था कि मैं यह जानना चाहता हूं कि पॉइंटर को उस बिंदु के पते को निर्दिष्ट करने के वैकल्पिक तरीके हैं जो इसकी ओर इशारा करते हैं।एक सूचक को

int a = 10; 
int *ptr; 
ptr = &a; 

लेकिन कुछ स्थानों मैं देख रहा हूँ यह कैसा घोषित पर:

int *ptr = &a; 

इन तरीकों से बराबर के दोनों कर रहे हैं उदाहरण के लिए, हमेशा की तरह है? मैं थोड़ी उलझन में हूं क्योंकि मुझे हमेशा मूल्य देने के पते के रूप में * पीआरटी माना जाता है, लेकिन पता नहीं। क्या कोई समझा सकता है? धन्यवाद।

+0

दोनों ही हैं – kapil

+2

'int * ptr लिखते समय;' आप एक सूचक घोषित करते हैं। * पीआरटी लिखते समय आप मूल्य आवंटित करते हैं। यह घोषणा है कि * ऑपरेटर – loginn

+1

के अर्थ को बदलता है आप 'int a = 10, * ptr = & a;' भी लिख सकते हैं :) :) वे वही बात हैं –

उत्तर

9

मैं थोड़ा उलझन में हूँ क्योंकि मैं हमेशा a का मूल्य दे रही है, और नहीं पता के रूप में *ptr माना जाता है।

यह वास्तव में एक सा * रूप में भ्रामक एक सूचक की घोषणा करने के लिए किया जाता है, और यह भी भिन्नता ऑपरेटर के रूप में इस्तेमाल किया। * का वास्तविक अर्थ संदर्भ पर निर्भर करता है - चाहे घोषणा, प्रारंभिकरण या असाइनमेंट में उपयोग किया जाता है।

1) घोषणा के बीच अंतर जानने के लायक है, 2) प्रारंभिकरण, और 3) असाइनमेंट।

int *ptr; // 1) this is declaration without initialisation. 

int *ptr = &a; // 2) this is declaration **and** initialisation (initialise ptr to the address of variable a) 

int b = 10; 
*ptr = b; // 3) this is assignment, assign what pointed by ptr to value of variable b. 
  • 1 में) * मतलब यह है कि ptrint के लिए सूचक है (लेकिन यह किसी वैध स्थान पर अभी तक बताया नहीं गया है)।
  • 2) * का अर्थ है कि ptrint पर एक सूचक है, और इसका प्रारंभिक मान परिवर्तनीय a का पता है।
  • 3) * डेरेंसेंस ऑपरेटर है, यानि ptr द्वाराके मान पर इंगित करने के लिए निर्दिष्ट किया गया है।* ऑपरेटर तो यह सिर्फ चर के प्रकार इंगित करने के लिए प्रयोग किया जाता है घोषणा के समय में प्रयोग किया जाता है
+0

उत्तर के लिए धन्यवाद! मैं इसे अब बहुत बेहतर समझता हूं :) – QPTR

2

नहीं .. यह एक पंक्ति में घोषणा और Intiliaziation है।

.. यह विचार साफ हो जाएगा

typedef int* intp; 

intp ptr=&a; 

इसके तुल्य

intp ptr; //int *ptr; 
ptr=&a; // ptr=&a; 

जवाब है: हां वे बराबर हैं।

आप पूछना सकते हैं: - कैसे एक संकलक समझते हैं (चाहे * अविवेक है या घोषणा में के रूप में)

उत्तर: - सी संदर्भ यह है जिस पर पर sensitive..based संदर्भ है प्रयुक्त कंपाइलर इसका फैसला करता है।

+0

उत्तर के लिए धन्यवाद! :) – QPTR

+1

यह ठीक है ... @ क्यूपीटीआर .: – coderredoc

1

int *ptr; ptr = &a; रूप int n; n = 3;int n = 3; है int *ptr = &a; है।

यही है, सूचक घोषणा और प्रारंभिक सामान्य चर के लिए अलग नहीं है। जब भी संभव हो मैं एक लाइन का उपयोग करना पसंद करता हूं तब से अनियंत्रित चर होने का कम खतरा होता है।

+0

धन्यवाद! अब जब मुझे पता है कि यह एक लाइनर का उपयोग करने के लिए थोड़ा कम खतरनाक प्रतीत होता है, तो उस दृष्टिकोण का अधिक उपयोग करने की कोशिश करेगा। – QPTR

1

तो घोषित किया गया। जबकि अन्य सभी मामलों में * ऑपरेटर को डीरेंसेंस ऑपरेटर के रूप में उपयोग किया जाता है (सिवाय इसके कि इसे गुणात्मक ऑपरेटर के रूप में उपयोग किया जाता है)।

तो int *ptr = &a मतलब है ptr प्रकार int * जो &a

और *ptr = a सौंपा गया है की एक चर रहा है variable stored at address ptr (अपसंदर्भन ptr) जिसका मतलब है सौंपा जा रहा है a

+0

उत्तर के लिए धन्यवाद! – QPTR

2

क्या ये दोनों तरीके बराबर हैं?

हां।

दूसरे को मामूली रूप से प्राथमिकता दी जाती है क्योंकि पहली पंक्ति ptr को अंतिम पंक्ति तक असाइन नहीं किया जाता है (हालांकि अभ्यास में एक कंपाइलर शायद इसे अनुकूलित कर देगा)।

मैं थोड़ी उलझन में हूं क्योंकि मुझे हमेशा एक पीआरटी माना जाता है, जैसा कि पता नहीं है, बल्कि पता नहीं।

आप उस चर का उपयोग करने के लिए वाक्यविन्यास के साथ एक चर घोषित वाक्यविन्यास को भ्रमित कर रहे हैं।

int *ptr; 

सिर्फ एक चर ptr कहा जाता है एक पूर्णांक के लिए सूचक है कि घोषणा की।

int *ptr = &a; 

बिल्कुल वही करता है। पहला भाग अभी भी पहले के रूप में सूचक की घोषणा है। बराबरी के बाद वाले हिस्से की a

आप सही है कि घोषणा के बाद आप बाद में इस चर बाद कोड में निर्दिष्ट *ptr आप सूचक की सामग्रियों (a का मूल्य दे देंगे इस मामले में उपयोग करते हैं पता करने के लिए ptr हस्ताक्षर initialises)।

+1

उत्तर के लिए बहुत बहुत धन्यवाद, यह अवधारणा को साफ़ करने में मदद करता है। मैं इतने सारे उत्तरों की उम्मीद नहीं कर रहा था, और हर जवाब अवधारणा को समझने में मेरी मदद कर रहा है, इसलिए आपका जवाब स्वीकार नहीं कर पाएगा। लेकिन बहुत बहुत धन्यवाद! :) – QPTR

+1

कोई समस्या नहीं @QPTR, मुझे खुशी है कि इससे मदद मिली। – GrahamS

संबंधित मुद्दे