int * i; या इंट * i; या इंट * i; [बन्द है]


30

पॉइंटर घोषित करने की आपकी पसंदीदा विधि क्या है?

int* i;

या

int *i;

या

int * i;

या

int*i;

कृपया समझाएं।

इसे भी देखें: http://www.stroustrup.com/bs_faq2.html#whitespace


19
मैं 3000 रेखाओं पर ध्यान केंद्रित करना पसंद करूंगा ...


यह मूल रूप से एक ही सवाल है; यहाँ मेरा जवाब है
कीथ थॉम्पसन

जवाबों:


75

यदि आप लिखते हैं:

int* i, j, k;

आप भ्रामक रूप से सुझाव देते हैं कि i, j और k के सभी संकेत हैं int

तो मुझे लगता है कि यह बेहतर है कि चर नाम से एनेक्स किया जाए।


35
और मेरा सुझाव int * i;है कि यह केवल एक गैर-दावेदार है क्योंकि यह एक त्वरित नज़र में गुणा की तरह दिखता है।
जॉन के

1
+1 क्योंकि मैंने पहले इस परिदृश्य पर विचार नहीं किया था।
पोप

4
"आप भ्रामक रूप से सुझाव देते हैं कि सभी i, j और k int के संकेत हैं।" जब तक आप C # नहीं लिख रहे हैं, जहां int*एक प्रकार के रूप में देखा जाता है, और int* i, jदो बिंदुओं की घोषणा करता है। प्रश्न को अपूर्ण माना जा सकता है - यह उस भाषा पर निर्भर करता है जिसका आप उपयोग कर रहे हैं जो शैली उचित हैं। CI अनुसरण में int *x, C # में अन्यथा करता हूं।
जोरेन

1
@Joren: क्षमा करें, एक C # प्रोग्रामर नहीं होने के कारण, मैंने केवल प्रश्न में कोड के टुकड़े को देखकर माना था कि C या C ++ था।
रान्डेल शुल्ज

मुझे लगता है कि यह पूरी तरह से उचित है कि इसका सी या सी ++ जब तक कि सी # विशेष रूप से उल्लेख नहीं किया गया है। सी # में बहुत बार पॉइंटर्स नहीं देखता है।
वैकल्पिक

62

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


8
मैं भी इस सम्मेलन का पालन करता हूं। एक ही कारण के लिए।
गैबलिन

5
व्यक्तिगत रूप से, यदि मैं अपने कोड में कई बिंदुओं की घोषणा कर रहा हूं, तो मैं इसे कोड गंध के रूप में मानता हूं। मुझे कई बिंदुओं की आवश्यकता नहीं होनी चाहिए; और आमतौर पर, मैं नहीं। इसलिए एक पंक्ति में कई घोषणाओं का मुद्दा मेरे द्वारा लिखे गए किसी भी कोड में कभी नहीं आता है: प्रति पंक्ति एक घोषणा।
ग्रेफेड

5
इसके साथ समस्या यह है कि प्रकार एक "सूचक से एक इंट" नहीं है। C (और C ++) में पॉइंटर टाइप नहीं है। यह मेमोरी के एक ब्लॉक के लिए एक पॉइंटर है, जिसमें से टाइप इंट है।
बिली ओपल

10
मेरा तर्क है कि *iएक प्रकार का है int
टिम गुडमैन

5
@ बिली: यदि हां, तो मैंने मानक को समझने, समझने और समझाने की कोशिश करने के 12 वर्षों में उस भ्रम को कभी नहीं देखा है। "पॉइंटर टू ए इंट" सी और सी ++ में पूरी तरह से मान्य प्रकार है।

23

C के लिए, जहाँ हमारा प्रकारों पर एक मजबूत ध्यान नहीं है, मुझे पसंद है:

int *i;

क्योंकि यह intसूचक है, न कि सूचक पर। क्या है int? *iint है।


2
अच्छी बात। संकेत के साथ, आप नाम के भाग के रूप में शुरुआत के बारे में सोच सकते हैं। उदाहरण के लिए, यदि आपके पास int i = 5, का मान प्राप्त करने के लिए i, आप नाम का उपयोग करते हैं i। इसी तरह, यदि आपके पास है int *i; *i = 5, तो मूल्य प्राप्त करने के लिए, आप उपयोग करते हैं *i
mipadi

मैं int * i as: * i int पढ़ता हूं। इसलिए मैं int के लिए एक सूचक है। C उपयोग प्रकार के भावों में भिन्न घोषणाएँ, int और * बस ऑपरेटर हैं। int * i को int (* (i) के रूप में पार्स करता है और व्याख्या की जाती है क्योंकि मेरे पास टाइप पॉइंटर-टू-पूर्णांक है। char * p [] parses as char (* ([) (p))) (क्योंकि [] में * की तुलना में अधिक पूर्वता है) और इसका अर्थ है: p में पॉइंटर-टू-टाइप का चार प्रकार है।
जियोर्जियो

इस कारण से मुझे लगता है कि उन्होंने चर के बगल में * लिखना पसंद किया, क्योंकि * एक ऑपरेटर है जो इसे लागू करता है।
जियोर्जियो

7

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

int* a, *b; // not int* a, b;

क्योंकि आपको यह नियम याद रखना चाहिए, आप कोई भी सरलता से हासिल नहीं करते हैं - लेकिन मैं यह नहीं कहूंगा कि यह अधिक जटिल है, या तो। एक पंक्ति में कई घोषणाओं से बचना इस नियम को याद रखने का एक और तरीका है। दो शैलियों के बीच अंतर मूक है।

यद्यपि मैं इसका उपयोग करता हूं, फिर भी, यह सी डिक्लेरेशन सिंटैक्स काम करने का दिखावा करने के लिए थोड़ा मूर्खतापूर्ण महसूस करता है, इसके अलावा तारांकन के बजाय टाइप के बगल में तारांकन चिह्न लगाकर करता है जिससे यह वाक्यबद्ध रूप से बाध्य होता है।

मैं इसमें नहीं खरीदता हूं कि एक सूचक प्रकार पर जोर देता है (के लिए i), जबकि दूसरा *iअंतर प्रकार पर जोर देता है (के लिए ), लेकिन यह हो सकता है कि 15 साल के बाद सी और सी ++ का उपयोग करें, यह सिर्फ तब होता है जब मैं इसे देखता हूं, बिना इस बारे में सोचने वाले to- सबसे शुरुआती शुरुआती जो इस सवाल को पूछते हैं वे अभी तक नहीं कर सकते हैं।

इसके अलावा, यहां तक ​​कि अपनी पसंद को देखते हुए, मुझे दूसरी शैली में कोड पढ़ना / लिखना अजीब नहीं लगता। संगति, ब्ला ब्ला ब्ला।

जिक्र करने की भी जरूरत नहीं int * i


6

मैं पहले वाले को पसंद करता हूं। यह स्वाभाविक है क्योंकि सूचक एक प्रकार का हिस्सा है।

जैसा कि मैं C # का उपयोग करता हूं, यह C की तुलना में अधिक सहज तरीके से हैंडल करता है, इसलिए समान बिंदु में कई पॉइंटर्स घोषित करने में कोई समस्या नहीं है:

int* a, b, c; // three pointers

5

मैं पसंद करता हूं int* i(सी ++ - शैली)।
मैं परिणामस्वरूप दृश्य अस्पष्टता ( int* i, j) के कारण एक बयान में कई चर घोषित करने से बचता हूं ।

तर्कसंगतताओं के लिए बज़्ने स्ट्रॉस्ट्रुप की सी ++ शैली और तकनीक के अक्सर पूछे जाने वाले प्रश्न भी देखें ।


4

यदि आप कई चर घोषित करना चाहते हैं लेकिन तारांकन को दोहराना नहीं चाहते हैं:

template <typename T>
struct pointer_to
{
    typedef T* type;
};

pointer_to<int>::type p1, p2, p3;

(जैसा कि आप संरचना टेम्पलेट के अंदर देख सकते हैं, मुझे पसंद है int* i शैली है।)

और यहाँ एक अधिक सामान्य समाधान है:

template <typename T>
struct identity
{
    typedef T type;
};

identity<int*>::type p1, p2, p3;

यह कोई भी "समस्याग्रस्त प्रकार" के साथ काम करता है, उदाहरण के लिए सरणियाँ और संदर्भ:

identity<int[10]>::type a1, a2, a3;

identity<int&>::type r1(*p1), r2(*p2), r3(*p3);

omg, c ++ हमेशा मेरे लिए कुछ नया दिखाता है :)। धन्यवाद!
तमसे सजेलेई

1
OMG, C ++ भयानक है! typedef int* int_ptrचालबाजी की होगी। ज़रूर, मुझे अलग-अलग पॉइंटर प्रकारों के लिए एक नया टाइपराइफ़ घोषित करना होगा, लेकिन व्यवहार में यह कितने होंगे? आठ सबसे ज्यादा?
बेंजो

1
@benzado व्यवहार में, आपको मेरे द्वारा दिखाए गए किसी भी प्रकार के फैंसी ट्रिक्स या किसी भी प्रकार की चाल की आवश्यकता नहीं है, क्योंकि कोई भी समझदार व्यक्ति एक पंक्ति में कई चर घोषित नहीं करता है। फिर भी दिलचस्प है, हालांकि।
fredoverflow

2
मुझे पता है, मैं भाषा सुविधाओं का उपयोग करने के लिए C ++ कार्यक्रमों की प्रवृत्ति के लिए अधिक बोल रहा था क्योंकि वे कर सकते हैं।
बेंज़ादो

@बेनज़ादो: !!! मैंने ऐसा अक्सर देखा है!
जियोर्जियो

2

मैं के लिए जाना चाहते हैं int* i;, जबकि दूसरे भाग नाम को दर्शाता है, के बाद से पहले भाग चर का प्रकार (पूर्णांक सूचक) को दर्शाता है ( i)। यह मेरे लिए समझ में नहीं आता है कि प्रकार है intऔर नाम है *i। इसके अलावा, int * i;मेरे लिए एक गुणा की तरह लग रहा है।


C घोषणा सिंटैक्स इस संबंध में सुसंगत नहीं है, क्योंकि पहचानकर्ता के बाद टाइप जानकारी आसानी से आ सकती है: सरणियाँ सबसे स्पष्ट उदाहरण हैं।

@रोगर: मुझे पता है, लेकिन यह सवाल विशेष रूप से एक एकल चर घोषणा के बारे में था, और कुछ नहीं।
एलोन गुरिलनेक

मुझे लगता है कि इसमें थोड़ा बहुत पढ़ा जा रहा है। :) जिस तरह से मैं इस प्रश्न को समझता हूं, यह पूछ रहा है कि आप हर जगह किस शैली का उपयोग करते हैं।

@रोगर: आप शायद सही हैं, लेकिन मेरा उद्देश्य ओपी के सवाल का जवाब देना था: "पॉइंटर घोषित करने के लिए आपका पसंदीदा तरीका क्या है?"। जाहिर है, हर कोई प्रश्न में प्रस्तुत मुद्दे पर एक बोर्डर नज़र लेने के लिए स्वतंत्र है, और यहां तक ​​कि इसे प्रोत्साहित किया जाता है। जैसा कि कोई व्यक्ति जो C / C ++ में विकसित नहीं होता है, मैंने महसूस किया कि ऐसा करना मेरी विशेषज्ञता के क्षेत्र से बहुत अधिक भटका होगा।
एलन गुरलीनक

2

जिन घोषणाओं में मैं उपयोग करता हूं int * i;, आप उसे इस रूप में पढ़ेंi is a pointer to an integer

पॉइंटर टाइप और वैरिएबल दोनों में योगदान देता है इसलिए इसे बीच में होना चाहिए।

एक ही पंक्ति में कई चीजों की घोषणा करने से बचना अच्छी बात है: int * i, j;


1

मैं वास्तव में विशिष्ट परिस्थितियों में सभी तीन सम्मेलनों का उपयोग करता हूं। पहली नज़र में मैं असंगत लगता हूँ, लेकिन ...

  • int * जब पहचानकर्ता मौजूद नहीं होता है, तो नेत्रहीन यह सुदृढ़ करने के लिए कि नाम मौजूद नहीं है।
  • int* intptrपर typedefहै और इसी तरह की घोषणाओं नेत्रहीन सुदृढ़ करने के लिए उस प्रकार के यह की ओर से। इसी तरह फ़ंक्शन पॉइंटर घोषणाओं के साथ:(int* (*foo)(int))
  • int *identifierऔर class &identifierफंक्शन पैरामीटर्स पर नेत्रहीन रूप से सुदृढ़ करने के लिए कि पैरामीटर संभवतः एक तथाकथित "आउट" पैरामीटर है।
  • const int * const * constजब भी मैं cv क्वालिफायर का उपयोग करता हूं ।
  • int * foo; स्थानीय घोषणाओं पर।

मुझे लगता है कि मैं कुछ हद तक नेत्रहीन हूं।


1

C में कोई सूचक प्रकार नहीं हैं! तो, "int *" का मतलब कुछ भी नहीं है। तारांकन हमेशा इसके ठीक लिखे गए तत्व से जुड़ा होता है, यह उसी तत्व के अंतर्गत आता है। "* i" एक इंट है। और * i के कारण एक int है, यह निम्नानुसार है कि मैं int का सूचक है। इसके पीछे तर्क है और यही कारण है कि "int * i" एकमात्र संभव समाधान है। बाकी सब कुछ एक भ्रम है (जो ज्यादातर मामलों में कंपाइलर द्वारा स्वचालित रूप से ठीक किया जाता है)। C ++ और C # में यह कुछ अलग है। लेकिन सी के लिए केवल एक बाइबिल है: "डेनिस एम। रिची: द सी प्रोग्रामिंग लैंग्वेज"। डेनिस (RIP!) ने इसे लिखा: "int * i"। इस पर सवाल उठाने की जरूरत नहीं है।


6
"सी में कोई पॉइंटर प्रकार नहीं हैं" - आपको यह विचार कहां से मिला? int*एक सूचक प्रकार है।
कीथ थॉम्पसन

-2

मैं उपयोग करता हूं int *iक्योंकि यह देखना आसान है कि यह एक सूचक है, हालांकि मुझे नहीं लगता कि यह वास्तव में मामला है।

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