2010-09-21 17 views
6

मेरे पास एक प्रश्न है जो किसी भी तरह से है, मुझे लगता है, पूरी तरह से तुच्छ: वह क्या है (और क्यों)?अस्पष्ट सूचक घोषणा

const float *(*const*)(int) 

मेरे समझ है कि यह एक "तर्क के रूप में एक पूर्णांक ले रहे हैं और लगातार नाव के लिए सूचक वाला फ़ंक्शन करने के लिए एक निरंतर सूचक को सूचक" है।

क्या यह सही है?

(*const*) "मानसिक रूप से पार्स" कैसे करें? खासकर जब कोई नाम नहीं है, तो पहले मुझे नहीं पता था कि कहां से शुरू करना है। मुझे लगता है कि "नाम" के लिए एकमात्र संभावना इसे इस तरह रखना होगा: *const *name क्योंकि अन्य संयोजन अमान्य हैं (यदि मैं सही हूं), तो "नाम निरंतर सूचक के लिए एक सूचक है ..."।

क्या यह तर्क मान्य है?

धन्यवाद!

+4

मैं टाइपिफ़ का उपयोग करके घटकों में इसे तोड़कर इस तरह दिमागी झुकाव परिभाषाओं से बचने की कोशिश करता हूं। –

+1

c giggerish से EN: "http://cdecl.ridiculousfish.com/?q=const+float+*%28*const*+foo%29%28int%29" – Anycorn

+0

किसी को भी उपरोक्त कोड को एक कंपाइलर में प्लग करने में कठिनाई हो रही है इसे फ़ंक्शन प्रोटोटाइप 'int foo (const float * (* const *) (int)) में पैरामीटर के रूप में डालने का प्रयास करें;' जो 'int foo (const float * (* const * var_name) (int) के समान है) ; ' – nategoose

उत्तर

6

हां यह तर्क वैध है। इसे सभी '*' es के दाईं ओर रखें जो फ़ंक्शन पैरामीटर सूचियों के भीतर नहीं हैं और सभी [] 'es के बाईं ओर हैं जो फ़ंक्शन पैरामीटर सूचियों में नहीं हैं। फिर आपके पास

const float *(*const* name)(int) 

फिर इसे सामान्य रूप से पढ़ें। उस पर और नाम के लिए सही जगह को कैसे ढूंढें, there are कई ट्यूटोरियल इंटरनेट पर इसका विश्लेषण कैसे करें।

सी ++ के लिए, आप geordi में देखना चाह सकते हैं।

< litb> geordi: -c int name; 
< geordi> Success 
< litb> geordi: make name a const float *(*const*)(int) and show 
< geordi> -c float const *(*const* name)(int) ; 
< litb> geordi: << TYPE_DESC(const float *(*const*)(int)) 
< geordi> pointer to a constant pointer to a function taking an integer 
      and returning a pointer to a constant float 

फिर आप यह

< litb> geordi: show parameter-declaration and first decl-specifier-seq 
< geordi> `int` and `float const`. 
< litb> geordi: make name an array of 2 pointer to function taking int and 
     returning pointer to float and show 
< geordi> -c float const *(* name[2])(int); 

यह आप अंग्रेजी

< litb> geordi: make name an array of 2 pointer to (float const*(int)) and show 
< geordi> -c const float *(* name[2])(int); 

जैसा कि आप देख के साथ सी मिश्रण की सुविधा देता है की वाक्य रचना पर विश्लेषण कर सकते हैं, यह बहुत शक्तिशाली है।

+0

"geordi" के लिंक के लिए धन्यवाद, यह प्रभावशाली लग रहा है! –

12

आप सही हैं कि नाम *const* के बाद चला जाता है। आप cdecl.org में लाइन const float *(*const* name)(int) प्लग, तो यह आपको बता देगा कि यह अर्थ है "समारोह (int) को स्थिरांक सूचक को सूचक के रूप में नाम की घोषणा स्थिरांक नाव सूचक लौटने"

मानसिक पार्स का सवाल है, मैं तो बस याद है कि R (*p)(A) कार्य करने के लिए एक सूचक है। इसलिए R (**p)(A) काम करने के लिए पॉइंटर के लिए एक सूचक है, और इस बिंदु पर यह सब कुछ याद रखना है कि कैसे const और * बातचीत करें।

+1

+1 + cdecl.org – nategoose

+1

++ के बारे में मुझे सिखाने के लिए http://cdecl.org/ – AlcubierreDrive

+0

लिंक के लिए cdecl लिंक के लिए धन्यवाद। –

2

बस में बाहर से काम

आप फ़ॉर्म के लिए कुछ है:।

U D(V) 

ताकि आप की तरह कुछ कार्य हो।

कुछ ऐसा कार्य है जो int ले रहा है और const float* लौटा रहा है।

(*const*) के लिए आप सही स्थान पर const प्राप्त करने के लिए पीछे की ओर काम करते हैं (हालांकि सममित होने के कारण यहां तक ​​कि इससे कोई फर्क नहीं पड़ता!)। *const* ~ "पॉइंटर टू कॉन्स्ट पॉइंटर टू", int * const * ppconst पॉइंटर int पर पॉइंटर है।

इसे सभी एक साथ रखकर: int पर कार्य करने के लिए पॉइंटर को पॉइंटर और const float * लौटा रहा है।

+0

धन्यवाद! यह बहुत जटिल नहीं था। –

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