C / C ++ में पॉइंटर चर घोषित करने का सही तरीका [बंद]


91

मैंने देखा कि कुछ लोग सूचक चर घोषित करने के लिए निम्नलिखित संकेतन का उपयोग करते हैं।

(a) char* p;

के बजाय

(b) char *p;

मैं (बी) का उपयोग करें। अंकन (ए) के पीछे तर्कसंगत क्या है? संकेतन (b) मेरे लिए अधिक मायने रखता है क्योंकि वर्ण सूचक स्वयं एक प्रकार नहीं है। इसके बजाय प्रकार चरित्र है और चर चरित्र के लिए एक संकेतक हो सकता है।

char* c;

ऐसा लगता है कि एक प्रकार चार है * और चर c उस प्रकार का है। लेकिन वास्तव में प्रकार चार है और * सी (स्मृति स्थान जिसे सी द्वारा इंगित किया गया है) उस प्रकार (चार) का है। यदि आप एक साथ कई चर घोषित करते हैं तो यह अंतर स्पष्ट हो जाता है।

char* c, *d;

यह अजीब लग रहा है। C और d दोनों एक ही तरह के पॉइंटर्स हैं जो किसी कैरेक्टर की ओर इशारा करते हैं। इसमें अगले के बाद से अधिक प्राकृतिक दिखता है।

char *c, *d;

धन्यवाद।


7
आपका क्या मतलब है कि चर सूचक एक प्रकार नहीं है। क्या आप कह रहे हैं कि एक सूचक एक प्रकार नहीं है?
बेंजामिन लिंडली

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

1
इसके अलावा, आपका तर्क "प्रकार चार है और * सी (सी द्वारा निर्दिष्ट मेमोरी स्थान) उस प्रकार (चार) का है" यह दर्शाता है कि एक चार्ट घोषित किया जा रहा है, जब वास्तव में, वहाँ नहीं है। यदि इसे इस तरह से व्यवहार किया जाता है, जैसा कि कभी-कभी शुरुआती लोगों द्वारा किया जाता है, तो यह निश्चित रूप से मेमोरी एक्सेस उल्लंघन का कारण होगा।
बेंजामिन लिंडले

1
दोनों अभी भी पर्याप्त रूप से वर्णनात्मक हैं, (b) शो * p प्रकार का है charऔर (a) शो p एक हैpointer to a char
A Person

1
उद्योग के एक दशक के अनुभव के साथ, आज पहली बार यह आया था, और केवल अन्य उद्योग पेशेवरों से लेख पढ़ने में। जाहिर है, तब, मैंने कभी भी इन के बारे में धार्मिक बातचीत के रूप में कोई बात नहीं की है क्योंकि मैं टैब वी रिक्त स्थान के साथ रहा हूं, डीफ़ या डिक द्वारा टिप्पणी, या किसी भी अन्य "विषयों के बारे में बहस करने के लिए और अधिक महत्वपूर्ण कुछ भी नहीं होना अच्छा है" । यह मेरा दृष्टिकोण है, मैंने पसंद किया है, इसलिए मेरे करियर के खेल में देर हो गई है, "चार * पी" के साथ जाने की तुलना में अधिक बार नहीं। हां, पहले स्पेस, बाद में स्पेस। ज्यादातर के रूप में मुझे लगता है कि यह बग को कम कर देता है, क्योंकि यह पॉइंटर-नेस को अधिक स्पष्ट बनाता है।
किट 10

जवाबों:


102

बज़्ने स्ट्रॉस्ट्रुप ने कहा:

"Int * p;" के बीच चुनाव और "int * p?" सही और गलत के बारे में नहीं है, लेकिन शैली और जोर के बारे में है। सी ने जोर दिया अभिव्यक्ति; घोषणाओं को अक्सर एक आवश्यक बुराई से थोड़ा अधिक माना जाता था। सी ++, दूसरी ओर, प्रकारों पर भारी जोर दिया गया है।

एक "ठेठ सी प्रोग्रामर" लिखते हैं "int * p;" और यह समझाता है "* p वही है जो इंट" सिंटैक्स पर जोर दे रहा है, और शैली की शुद्धता के लिए बहस करने के लिए सी (और C ++) घोषणा व्याकरण को इंगित कर सकता है। दरअसल, व्याकरण में नाम p को बांधता है।

एक "ठेठ C ++ प्रोग्रामर" लिखते हैं "int * p;" और यह समझाता है कि "पी एक इंट का सूचक है" जोर देने वाला प्रकार। वास्तव में पी का प्रकार int * है। मैं स्पष्ट रूप से उस जोर को पसंद करता हूं और इसे C ++ के अधिक उन्नत भागों का उपयोग करने के लिए महत्वपूर्ण मानता हूं।

स्रोत: http://www.stroustrup.com/bs_faq2.html#whitespace

मैं बाद की शैली की सिफारिश करूंगा क्योंकि उस स्थिति में जहां आप एक लाइन में कई पॉइंटर्स घोषित कर रहे हैं (आपका चौथा उदाहरण), चर के साथ तारांकन वह होगा जो आप उपयोग कर रहे हैं।


34
दूसरों को कभी भी एक ही घोषणा में कई वस्तुओं की घोषणा नहीं करने की सलाह देते हैं। :-)
बो पर्सन

5
मैं वाक्यविन्यास के पीछे तर्क पर जोर देता हूं, इस प्रकार मैं पसंद करता हूं: int *pजिसका अर्थ है: जब pमुझे दिया जाता है तो मुझे ए मिलता है int। तब अलग-अलग घोषणाओं से अलग ,समझ में आता है: int *p, *q, r(जब pया qमेरे द्वारा प्राप्त किया गया हो int, जब rमुझे संदर्भित किया जाता है तो मुझे ए int) मिलता है । इसके अलावा, फ़ंक्शन पॉइंटर सिंटैक्स समझ में आता है: int (*f)()(जब fमुझे संदर्भित किया जाता है और कहा जाता है कि मुझे मिलता है int)। और यह समझ में आता है int *p, (*f)():।
Druesukker

2
इससे मुझे महसूस हुआ कि तर्क के दूसरे पक्ष की वैधता है। होने के नाते, ज्यादातर, एक उच्च-स्तरीय प्रोग्रामर, मैं प्रकार पर जोर देता हूं; और पसंद करते हैं int*। मेरे लिए, int *p, (*f)()बहुत समझ में नहीं आता है, लेकिन मैं देख सकता हूँ कि यह कुछ लोगों के लिए कुछ स्थितियों में कैसे होगा।
असिमिलाटर

1
@ Druesukker, आपका कथन उपरोक्त किसी भी विचार से अधिक समझ में आता है, मुझे लगता है।
मुंतशिर अकोन

1
@ ड्रेसुकेकर लेकिन तर्क बिल्कुल काम नहीं करता void*(और C ++ संदर्भों के लिए बिल्कुल भी काम नहीं करता है)।
jamesdlin

57

मैं व्यक्तिगत रूप *से बाकी प्रकार के साथ रखना पसंद करता हूं

char* p;  // p is a pointer to a char.

लोग बहस करेंगे "लेकिन फिर char* p, q;भ्रामक हो जाता है", जिस पर मैं कहता हूं, "ऐसा मत करो"।


चर * प के लिए बहुत अच्छा तर्क; पसंद :) मैं उनमें से किसी को भी बुरा नहीं मानता जब तक कि यह पढ़ना मुश्किल न हो जाए क्योंकि आपने जो उदाहरण दिखाया, उस स्थिति में उन्हें ऐसा नहीं करना चाहिए।
जीसस रामोस

1
और जब आप मूल्य का उत्पादन करना चाहते हैं? आप करते हैं cout << *p;। तो घोषणा के पहले स्टार को क्यों नहीं रखा गया :? मेरी राय में यह कम भ्रामक होगा। p*p
user1170330

13
@ user1170330, क्योंकि एक बार जगह में यह प्रकार की परिभाषा का हिस्सा है, और यह दूसरे में एक अनुमापन ऑपरेटर है। कोई संबंध नहीं। यदि कुछ भी हो, तो यह अच्छी बात है कि वे अलग दिखते हैं, क्योंकि अलग चीजें अलग दिखनी चाहिए।
इकेगामी

32

लिखने का कोई अंतर नहीं है। लेकिन अगर आप (b) वैरिएंट का उपयोग करने के लिए एक लाइन में दो या दो से अधिक पॉइंटर्स घोषित करना चाहते हैं, क्योंकि यह स्पष्ट है कि आप क्या चाहते हैं। नीचे देखें:

int *a;
int* b;      // All is OK. `a` is pointer to int ant `b` is pointer to int
char *c, *d; // We declare two pointers to char. And we clearly see it.
char* e, f;  // We declare pointer `e` and variable `f` of char type.
             // Maybe here it is mistake, maybe not. 
// Better way of course is use typedef:
typedef char* PCHAR;
PCHAR g, h;  // Now `g` and `h` both are pointers.
// If we used define construction for PCHAR we'd get into problem too.

5
typedef"कोर्स" का एक बेहतर तरीका नहीं है। कुछ लोग इसे पसंद कर सकते हैं, लेकिन यदि आपके कोड के साथ कई लोग काम कर रहे हैं तो यह समस्याग्रस्त है। अगर मुझे आदत नहीं है PCHAR, तो मैं कुछ ऐसा लिख ​​सकता हूं PCHAR *p;, जो एक ऐसा होगा char**और जो मैं इरादा नहीं करता। सामान्य तौर पर, यदि आप एक चाहते हैं, तो आपको एक नया प्रकार char**लिखना PCHAR*या परिभाषित करना होगा , और फिर यह सिर्फ बेवकूफ बनना शुरू हो जाएगा।
ब्लेक जेक

3
यदि किसी को काम करने के लिए कुछ जटिल पॉइंटर प्रकार जैसे पॉइंटर की आवश्यकता होती है, तो टाइपडिफ बनाना बहुत अच्छा है। वे इस मामले में कोड को बहुत सरल बनाते हैं। दूसरी ओर, PCHAR का उपयोग करना रोजमर्रा के अभ्यास की तुलना में अधिक कृत्रिम उदाहरण है। लेकिन यह स्पष्ट रूप से वही करता है जो आप चाहते हैं। और फिर यह सिर्फ बेवकूफ़ बनने लगता है। कृपया सभी शिकायतों को
स्ट्रॉस्ट्रुप

यदि आपने PCHAR * p को पॉइंटर को परिभाषित करने के लिए लिखा है तो यह स्पष्ट होगा कि आप नहीं जानते कि आप क्या कर रहे हैं और टाइप डीफ़ को नहीं पढ़ा है। जवाब उसकी राय में है। टंकण के लिए एक और लाभ है; सी में यह चीजों को अपारदर्शी बनाने के आसान तरीकों पर है। सार्वजनिक रूप से प्रतीक को VOID ptr के रूप में परिभाषित किया गया है, निजी तौर पर प्रकार डीईएफ़ कुछ और है .... मैं एक बार टाइप करने के लिए एक बार समायोजित करता हूं फिर कोड भर में सब कुछ समायोजित करता हूं जब हम किसी एक प्रकार के बारे में कुछ बदलते हैं ... लेकिन C ++ 11 में ऑटो के साथ इसका बहुत कुछ पता है
UpAndAdam

किसी के लिए सिर्फ कॉलेज के पांच साल बाद C ++ के साथ वापस आने की कोशिश करना, यह सबसे अच्छे उत्तरों में से एक है।
पैंजरक्रिसिस

10

समझौता है

char * p;

K & R उपयोग करता है

char *p;

यह आपके ऊपर है जब तक कि आप एक कोडिंग मानक का पालन नहीं कर रहे हैं - उस स्थिति में, आपको हर किसी का पालन करना चाहिए।


4
मैंने कठिन तरीका सीखा है कि char * x, y का मतलब यह नहीं है कि y एक char * है। अब मैं देख सकता हूँ कि के एंड आर उक्त शैली का अनुसरण क्यों कर रहा है।
राहुल कडुकर

K & R क्या है और इससे क्या फर्क पड़ता है कि कोड का एकल स्रोत क्या उपयोग करता है? मैं उपयोग करता हूं char* p;। यह शैली की बात है, सम्मेलन या नियमों की नहीं। मेरे लिए यह अधिक समझ में आता है कि पी प्रकार का है char*, इसलिए स्पष्ट रूप से * प्रकार के साथ होना चाहिए।
फाल्कोगर

@FalcoGer मैंने K & R के लिए एक लिंक जोड़ा है। इससे कोई फर्क नहीं पड़ता कि कोड का एक भी स्रोत क्या उपयोग करता है। यदि आप उनके मानक का पालन नहीं करते हैं तो आपकी टीम आपसे नाराज हो सकती है क्योंकि आप उन्हें अपने कोड को समझने के लिए कड़ी मेहनत कर रहे हैं। इन दिनों, मुझे उम्मीद है कि टीमें clang-formatवैसे भी उपयोग कर रही हैं ।
4nnnnnnnnnnnnnatennnnnnnnnnnnn

2

यह सभी वरीयता का मामला है, व्यक्तिगत रूप से उन परियोजनाओं पर जिन्हें मैं चार * देखता हूं मैं अलग-अलग लाइनों पर कई बिंदुओं की घोषणा करता हूं। ऐसा करने के लिए कोई वास्तविक "सही" तरीका नहीं है और यह सभी वरीयता के लिए नीचे आता है। कुछ लोग कहते हैं कि पढ़ना आसान है (ए) जबकि अन्य कहते हैं कि (बी) एक ही लाइन पर एक ही प्रकार के अधिक चर घोषित करना आसान है।

मुझे (बी) अधिक सामान्य लगता है, और कुछ मामलों में मैंने देखा है

char * a;

या इस तरह का कुछ। फिर से वरीयता। आपके द्वारा उपयोग किए जा रहे या जो भी प्रोजेक्ट मैं उपयोग कर रहा हूं, उसके साथ आप सहज हैं (जब तक कि मैं इसे स्वयं नहीं लिखता कि मैं किस मामले में उपयोग करता हूं) (ए)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.