सी पॉइंटर्स में पूर्वता कैसे निर्धारित की जाती है?


14

मुझे दो पॉइंटर घोषणाओं के बारे में पता चला है जिन्हें समझने में मुझे परेशानी हो रही है। पूर्ववर्ती नियमों की मेरी समझ कुछ इस प्रकार है:

Operator             Precedence             Associativity
(), [ ]                  1                  Left to Right
*, identifier            2                  Right to Left
Data type                3

लेकिन यहां तक ​​कि यह दिया गया, मुझे यह पता नहीं लग सकता है कि निम्नलिखित उदाहरणों का सही मूल्यांकन कैसे किया जाए:

पहला उदाहरण

float * (* (*ptr)(int))(double **,char c)

मेरा मूल्यांकन:

  1. *(ptr)
  2. (int)
  3. *(*ptr)(int)
  4. *(*(*ptr)(int))

फिर,

  1. double **
  2. char c

दूसरा उदाहरण

unsigned **( * (*ptr) [5] ) (char const *,int *)
  1. *(ptr)
  2. [5]
  3. *(*ptr)[5]
  4. *(*(*ptr)[5])
  5. **(*(*ptr)[5])

मुझे उन्हें कैसे पढ़ना चाहिए ?


1
यह पूछने पर कि कोई भाषा अपनी सुविधाओं को कैसे संभालती है, इस विषय पर यहाँ है।

जवाबों:


7

पहले एक के लिए मेरा अनुमान : ptr एक फ़ंक्शन के लिए एक पॉइंटर है जो पैरामीटर int के रूप में लेता है, और एक पॉइंटर को एक फ़ंक्शन में लौटाता है जो कि एक पॉइंटर को पॉइंटर को डबल और एक चर करने के लिए पैरामीटर के रूप में लेता है, और एक पॉइंटर को फ्लोट पर लौटाता है।

व्याख्या :

(* Ptr) (पूर्णांक)

कहते हैं कि ptr एक तर्क के रूप में एक int लेने वाले फ़ंक्शन का एक संकेतक है। यह जानने के लिए कि उस फ़ंक्शन को क्या मिलता है, हमें अपना विचार विस्तृत करना होगा:

(* (* ptr) (int))

इसका मतलब यह है कि फ़ंक्शन किसी अन्य फ़ंक्शन को पॉइंटर लौटाता है। उस अन्य फ़ंक्शन के पैरामीटर हैं:

(डबल **, चार सी)

और यह लौट आता है

तैरना *

और दूसरे एक के लिए : ptr पाँच पॉइंटर्स के फ़ंक्शंस के लिए एक पॉइंटर है जो मापदंडों के रूप में एक निरंतर पॉइंटर को चार और एक पॉइंटर को int में ले जाता है, एक पॉइंटर को अहस्ताक्षरित इंट के पॉइंटर पर लौटाता है।

व्याख्या :

(* (* ptr) [5])

एक समारोह में पाँच पॉइंटर्स की सरणी के लिए पॉटर को पॉइंटर घोषित करता है

(चार कास्ट *, इंट *)

तर्क और वापसी के रूप में

अहस्ताक्षरित **


7

आप इन पागल घोषणाओं को समझने के लिए 'द क्लॉकवाइज स्पाइरल' विधि को आजमा सकते हैं:

http://c-faq.com/decl/spiral.anderson.html

मैंने इसके बारे में यहाँ भी ब्लॉग किया है:

http://www.kalekold.net/index.php?post=4


जवाब देने के लिए धन्यवाद। लेकिन दक्षिणावर्त सर्पिल विधि में मेरे मामले में कहाँ से शुरू करें? लिंक पर दिए गए उदाहरणों में सरल उदाहरण हैं। मैं उस विधि से अपने समीकरण का मिलान नहीं कर पा रहा हूं।
२०

1
आपको अपने पहचानकर्ता से शुरू करना चाहिए: ptr। आपके पास होगा: "ptr एक फ़ंक्शन के लिए एक पॉइंटर है जो एक इंट ले जाता है और एक पॉइंटर को एक फ़ंक्शन में लौटाता है जो एक पॉइंटर को एक डबल और चार के लिए पॉइंटर ले जाता है और एक फ्लोट को पॉइंटर लौटाता है"। वर्णक्रमीय प्रयास करें और आप एक ही मिलेगा।
Remo.D

1

यह एक फंक्शन पॉइंटर है। जिस व्यक्ति ने इसे लिखा है, वह टाइपफेड का बेहतर उपयोग कर सकता था और इसे स्पष्ट कर सकता था।

यह इन मापदंडों के साथ कार्य करने के लिए एक सूचक है। फ्लोट * myfunc (डबल **, चार)


4
मेरी शर्त यह है कि जिसने इसे लिखा है वह शिक्षक है।
मौविसील

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

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