2010-11-17 14 views
14

संभव डुप्लिकेट:
Pointer declarations in C++: placement of the asteriskसी - संकेत के प्रारंभ, तारांकन स्थिति

तारांकन जगह सबसे उचित तरीका क्या है? क्यूं कर?

1) type*  var; 
2) type  *var; 
+13

आप 'टाइप * var' भूल गए। – pmg

+0

महान टिप्पणी pmg – DavideDM

+1

फिर भी एक और डुप्लिकेट [आपकी पसंदीदा पॉइंटर घोषणा शैली क्या है, और क्यों?] (Http://stackoverflow.com/questions/377164/whats-your-preferred-pointer-declaration-style-and- क्यों) , [टाइप घोषणा - सूचक क्षैतिज स्थिति] (http://stackoverflow.com/questions/2704167/type-declaration-pointer-asterisk-position), ... – caf

उत्तर

17

इससे कोई फर्क नहीं पड़ता कि आप केवल एक पॉइंटर घोषित कर रहे हैं। यह आमतौर पर दूसरे उदाहरण में लिखा जाता है (कोड में मैं आम तौर पर पढ़ता/लिखता हूं) लेकिन संकलक के लिए यह वही है।

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

type* var1, var2; 

इसके बजाय आप क्या करने की जरूरत:

type* var1, *var2; 

मैं हमेशा वर द्वारा * उपयोग करने के लिए पसंद करते हैं।

0

दूसरा मोड सही है। दूसरा मोड नौसिखिया प्रोग्रामर के लिए इतना स्पष्ट नहीं है। फॉर्म int * वैरिएबल आमतौर पर

+0

अन्य मोड इतना स्पष्ट क्यों नहीं है? –

+0

जब आप int * foo का उपयोग करते हैं, तो बार नहीं समझते हैं कि वेरिएबल बार एक पूर्णांक सूचक नहीं है – DavideDM

4

दोनों कार्य को हतोत्साहित किया जाता है। मैं बहस चाहते हैं कि # 1 सी में सामान्य, लेकिन भ्रामक में स्पष्ट है और त्रुटियों का कारण बन सकता है, जैसे:

type* var1, var2; 

// This actually means: 

type *var1; 
type var2; 

तो मैं कहेंगे कि # 2 सी में अधिक मुहावरेदार और इसलिए की सिफारिश की है, विशेष रूप से यदि आप कोड पर काम कर रहे एकमात्र प्रोग्रामर नहीं हैं (जब तक, निश्चित रूप से, आप सभी एक शैली पर सहमत नहीं हैं)।

1

मैंने सुना है यह तर्क दिया है कि तकनीकी रूप से * चर, में संशोधक है और इस घोषणाओं जैसे बहु चर में * कई बार उपयोग करने की आवश्यकता इसका सबूत है। int * पी, * क्यू, * आर;

हालांकि मुझे मूल प्रकार के संशोधक के रूप में इसके बारे में सोचना पसंद है क्योंकि प्रोटोटाइप में दिखाई देता है। उदाहरण के लिए। शून्य func (int *);

.PMCD।

पीएस। मुझे पता है कि मैंने आपकी समस्या में मदद नहीं की है :)

+0

मैं प्रोटोटाइप में 'int * '(स्पेस के बिना) कभी नहीं लिखता जब तक कि मैं कॉलम 80 को मार नहीं रहा हूं। IMO' int * '(के साथ अंतरिक्ष) स्पष्ट है। –

0

कोई भी "सबसे उचित स्थान" नहीं है।

आमतौर पर यह कोड शेष कोड का उपयोग करता है।

यदि आप शुरुआत से अपना कोड लिख रहे हैं और अपना खुद का सम्मेलन चुन सकते हैं: अपना खुद का सम्मेलन चुनें और इसके साथ चिपके रहें।

आप type * var के अलावा कुछ आप 'अजीब' स्थितियों को पूरा करेगा चुनते हैं:

/* write these with another style */ 
int * var; 
int const * var; 
int * restrict var; 

पी एस।इससे कोई फर्क नहीं पड़ता, लेकिन मैं आमतौर पर type *var;

0

का उपयोग करता हूं जो कि कोडर की वरीयता होगी।

int * var1, var2; 

जिसमें var1 एक सूचक है, और var2 नहीं है:

मेरे लिए, मैं से संकेत दिए गए घोषणा करते हैं। यदि आप एक पंक्ति में एकाधिक पॉइंटर्स घोषित करना चाहते हैं:

int * var1, * var2; 

और निश्चित रूप से, अन्य तरीकों का उपयोग वैध हैं।

0

घोषणा semantics अभिव्यक्ति semantics (विशेष रूप से ऑपरेटर प्राथमिकता) का पालन करें और मुझे दूसरी शैली का उपयोग करके पढ़ने के लिए और अधिक जटिल घोषणाओं को आसान लगता है।

आप अभिव्यक्ति *foo के प्रकार की घोषणा

int *foo; 

के बारे में सोच सकते हैं (यानी अविवेक ऑपरेटर foo पर लागू) foo के बजाय int प्रकार int * का घोषित किया जा रहा हो।

जो भी सम्मेलन आप चुनते हैं, बस सुसंगत होने का प्रयास करें।

4

सूचक प्रकार है, और मुझे लगता है कि समूह के प्रकार की जानकारी सबसे समझ में आता है:

int* foo, bar; // foo will be int*, bar will be int 
:

int* foo; 

यह अगर कई चर एक ही लाइन पर परिभाषित कर रहे हैं भ्रम की स्थिति को जन्म दे सकता

इसका समाधान यह है कि, एक ही पंक्ति पर कई चर घोषित न करें। कुछ भी Code Complete वकील, वैसे भी।

3

जैसा कि अन्य ने बताया है, दोनों ठीक काम करते हैं, और गलत व्यक्ति को वास्तव में सिंटेक्टिक अर्थव्यवस्था का लाभ होता है।

तरह से मैं इसे देख, एक घोषणा प्रकारचर के बाद के होते हैं।

<type> <variable>; 

int ii; 
int* pii; 

इसलिए, यदि आप चर दूर ले, क्या रहता है प्रकार है। int और int * ऊपर है। कंपाइलर int * आंतरिक रूप से एक प्रकार के रूप में व्यवहार करता है (जो सूचकांक int पर सूचक है)।

सी, दुर्भाग्य से, इस वाक्यविन्यास को निर्बाध रूप से समर्थन नहीं करता है।जब एक ही प्रकार के एकाधिक चर घोषित करने, यदि आप ऐसा करने में सक्षम होना चाहिए:

<type> <variable>, <variable>, <variable>; 

जो आप कर सकते हैं नहीं एक सूचक प्रकार के साथ:

int* ii1, ii2, ii3; 

के प्रकार पूर्णांक * और बाकी ii1 वाणी int टाइप करें। इससे बचने के लिए, मैं इसे प्रति पंक्ति केवल एक चर घोषित करने की आदत बना देता हूं।

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