2013-03-04 10 views
18

बस सोच अगर वहाँ के बीच कोई अंतर है:चार * var के बीच अंतर; और चार * var ;?

char* var; 
char *var; 

या यह वरीयता (रिक्ति) का मामला है?

+1

वे समकक्ष घोषणाएं हैं। – ouah

+3

http://stackoverflow.com/questions/398395/in-c-why-is-the-asterisk-before-the-variable-name-rather-than-after-the-type http://stackoverflow.com/ प्रश्न/3770187/अंतर-बीच-int-i-and-int-i – cnicutar

+1

यह वरीयता का मामला है, char * x अक्सर –

उत्तर

41

कहा इस मामले में कोई अंतर नहीं है। हालांकि, आपको char *var; पसंद करना चाहिए।

ऐसा इसलिए है क्योंकि * परिवर्तनीय नाम के साथ अधिक निकटता से जुड़ा हुआ है और आधार प्रकार का हिस्सा नहीं है। एक सूचक-हैं- char, और b, एक char

char* a, b; 

आप क्या a, है: उदाहरण के लिए, यदि आप ऐसा करते हैं। यह भ्रामक है! चूंकि * चरित्र char कीवर्ड के करीब है, हम उम्मीद करते हैं कि दोनों चर के प्रकार सूचक-हैं- char होगा, लेकिन * वास्तव में केवल a साथ जुड़ा हुआ है। (यह char a[10], b; के लिए इसी तरह के रूप में टिप्पणी में teppic से बताया है, [10] विनिर्देशक वैसे ही केवल a साथ जुड़ा हुआ है, और इसलिए केवल a एक सरणी हो जाएगा।)

सही घोषणा होगा:

char *a, *b; 

* विनिर्देशक चर के करीब लाना मतलब है कि यह देखने के लिए कि क्या एक सूचक होने के लिए एक चर के लिए जब आप इरादा हो रहा है आसान है और अन्य नहीं:

char *a, b; 

इस मामले में यह स्पष्ट है कि b एक सूचक होने का इरादा नहीं था। मूल उदाहरण (char* a, b;) में, हम नहीं जानते कि प्रोग्रामर b के लिए पॉइंटर होने के लिए लक्षित है या नहीं। डगलस क्रॉकफ़ोर्ड से उधार लेने के लिए, हम सभी जानते हैं कि प्रोग्रामर अक्षम है।

कुछ लोगों को पहले और बाद में एक जगह डाल चाहते *:

char * a, * b; 

यह ऊपर सचित्र एक ही समस्या का शिकार हो जाता है: यदि b एक सूचक तो घोषणा (char * a, b;) भी पैदा हो सकती है नहीं है प्रोग्रामर के इरादे के बारे में अनिश्चितता। इसलिए मैं * और परिवर्तनीय नाम के बीच एक जगह नहीं रखने का सुझाव देता हूं।

किसी भी तरह से आप इसे देखते हैं, char* var; को खराब शैली के रूप में माना जाना चाहिए। यह भाषा विनिर्देश के अनुसार व्याकरणिक रूप से सही है, लेकिन अपठनीय कोड की ओर जाता है क्योंकि प्रकट होता है यह इंगित करने के लिए कि * विनिर्देशक एक ही घोषणा में सभी चर द्वारा साझा किए गए प्रकार का हिस्सा है, जब यह नहीं है। (यह एक ही पंक्ति पर एक जटिल कार्य लिखने जैसा है - यह काम करता है, लेकिन यह एक बुरा विचार है। ऐसे मामले हैं जहां पठनीयता और रखरखाव व्यक्तिगत स्टाइलिस्ट वरीयताओं को पीछे छोड़ देता है, और यह उनमें से एक है।)


व्यक्तिगत रूप से, मैं बाद में एक रिक्ति डाल करने के लिए पसंद करते हैं *केवल जब समारोह वापसी मान के साथ काम:

char * foo(); 

यह स्पष्ट है: यह एक समारोह है कि एक सूचक रिटर्न है -to- char

char *foo(); 

प्रोग्रामर एक समारोह है कि एक सूचक-हैं- char लौटाता है, या वह एक समारोह है कि char रिटर्न के लिए सूचक बनाने के लिए मतलब था मतलब है? भाषा इसे अन्य प्रोटोटाइप के समान ही हल करेगी, लेकिन हमारा लक्ष्य पठनीयता है, और इसका मतलब यह है कि हम वास्तव में संकलक के लिए इंसानों का अर्थ बताते हैं।

+0

का उपयोग किया जाता है यह एक सरणी को परिभाषित करने के लिए [] के सहयोग की तुलना करना भी उपयोगी होता है, और() एक समारोह को परिभाषित करने के लिए। हालांकि ये पहचानकर्ता का पालन करते हैं, यह वही सिद्धांत है जो * के साथ सूचक को परिभाषित करता है। – teppic

+0

@teppic अच्छा बिंदु, वे विनिर्देशक भी वही व्यवहार करते हैं। जब आप उन पर विचार करते हैं तो '*' का व्यवहार थोड़ा अधिक समझ में आता है। – cdhowie

+1

मुझे 'char * var' शैली भी पसंद है क्योंकि मेरी राय में यह '*' अधिक अर्थपूर्ण अर्थपूर्ण अर्थ बनाता है। 'char * var' का तात्पर्य है कि 'var' द्वारा इंगित * dereferenced * मान का प्रकार' char' है, जो सत्य है। 'char * var' ऐसा लगता है कि आप चर-नाम 'char' के गलत पक्ष पर dereference ऑपरेटर डालते हैं, जो बिल्कुल भी समझ में नहीं आता है। –

5

कोई अंतर है, प्राथमिकता का सिर्फ एक मामले के रूप में आप अपने आप को

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