2008-10-28 9 views
30

कोई बता सकता है कि इसका क्या अर्थ है?सी चर परिवर्तनीय घोषणा में कोष्ठक क्या मतलब है?

int (*data[2])[2]; 
+0

यह माइक्रोसॉफ़्ट लिंक मदद कर सकता है। (या यह सिर्फ आपके मस्तिष्क को विस्फोट कर सकता है) [अधिक जटिल घोषणाकर्ताओं का व्याख्या करना] (http://msdn.microsoft.com/en-us/library/1x82y1z4.aspx) –

उत्तर

37

के लिए कोष्ठक क्या हैं?

सी कोष्ठक में [] तारांकन *

विकिपीडिया से अच्छा स्पष्टीकरण की तुलना में अधिक पूर्वता है:

एक सरणी के लिए एक सूचक, हमें चाहिए होने के रूप में एक चर घोषित करने के लिए कोष्ठक के का उपयोग करें। ऐसा इसलिए है क्योंकि सी ब्रैकेट्स ([]) में तारांकन (*) की तुलना में अधिक प्राथमिकता है।

double (*elephant)[20]; 

यह घोषणा करता है कि हाथी एक सूचक है, और प्रकार इसे कहते हैं एक है: तो अगर हम एक सरणी के लिए एक सूचक की घोषणा करना चाहते हैं, हम इस ओवरराइड करने के लिए कोष्ठक आपूर्ति की जरूरत 20 डबल मानों की सरणी।

पॉइंटर्स की एक सरणी में पॉइंटर घोषित करने के लिए, बस नोटेशन को गठबंधन करें।

int *(*crocodile)[15]; 

Source

और अपने वास्तविक मामला:

int (*data[2])[5]; 

डेटा 2 तत्वों की एक सरणी है। प्रत्येक तत्व में 5 इंट्स की सरणी में पॉइंटर होता है।

तो तुम क्या आप अपने 'डेटा' प्रकार का उपयोग कर कोड में हो सकता है:

int (*data[2])[5]; 
int x1[5]; 
data[0] = &x1; 
data[1] = &x1; 

data[2] = &x1;//<--- out of bounds, crash data has no 3rd element 
int y1[10]; 
data[0] = &y1;//<--- compiling error, each element of data must point to an int[5] not an int[10] 
+0

सही उत्तर! – J3STER

14

वहाँ एक बहुत ही कूल 'cdecl "है कि आप लिनक्स/यूनिक्स के लिए और शायद विंडोज के लिए के रूप में अच्छी तरह से डाउनलोड कर सकते हैं कहा जाता कार्यक्रम है। आप एक सी (या सी ++ में चिपकते हैं यदि आप सी ++ घोषित करते हैं) परिवर्तनीय घोषणा और यह सरल शब्दों में इसे मंत्रमुग्ध करता है।

+1

+1 cdecl – user7116

+1

का उल्लेख करने के लिए +1 @sixlettervariables जैसे नाम के साथ, मुझे लगता है कि आप मुझसे भी पुराने स्कूल हैं। कृपया मुझे बताएं कि आपको हेनरी स्पेंसर के आदेश याद हैं? –

+1

चित्र मैं उल्लेख करता हूं कि सीडीईसीएल अब एक वेबसाइट है: [cdecl.org] (http://cdecl.org/) – Urchin

-1

डेटा [2] - एक दो पूर्णांकों

की सरणी

* डेटा [2] - एक दो पूर्णांकों

की एक सरणी के लिए सूचक (* डेटा [2]) - "

(* डेटा [2]) [2] - एक 2 संकेत के दो पूर्णांकों का सरणियों को सरणी

+1

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

+0

हम्म, मुझे लगता है कि उद्धरण शायद एक डितो चिह्न है। मुझे अभी भी लगता है कि स्पष्टीकरण वांछित होने के लिए कुछ छोड़ देता है। –

4

आप जानते हैं कि कैसे सी में भाव पढ़ा, तो आप जटिल घोषणाओं पढ़ने से एक कदम दूर हैं तो

।।

क्या

char *p; 

वास्तव में क्या मतलब है? इसका मतलब है कि *p एक char है।

int (*data[2])[5]; 

का अर्थ क्या है? इसका मतलब है कि (*data[x])[y] एक int है (प्रदत्त= x < 2 और 0 < = y < 5)। अब, बस इसके बारे में सोचें कि इसके क्या प्रभाव हैं। data होना चाहिए ... 2 की एक सरणी ... पॉइंटर्स ... 5 के सरणी के लिए ... पूर्णांक।

क्या आपको नहीं लगता कि यह काफी सुरुचिपूर्ण है? आप जो कुछ कर रहे हैं वह अभिव्यक्ति के प्रकार को बता रहा है। एक बार जब आप इसे समझ लेंगे, तो घोषणाएं आपको फिर से डर नहीं पाएंगी!

"त्वरित नियम" वैरिएबल नाम से शुरू करना है, जब तक आप ए हिट नहीं करते हैं तब तक दाएं स्कैन करें), वैरिएबल नाम पर वापस जाएं और बाएं तक स्कैन करें जब तक आप एक हिट नहीं करते (। फिर "चरणबद्ध" कोष्ठक की जोड़ी है, और प्रक्रिया को दोहराने

चलो कुछ हास्यास्पद करने के लिए इसे लागू होते हैं:। तर्क के रूप में कार्य करता है प्रत्येक एक चार को स्वीकार करने के लिए 6 संकेत की एक सरणी और किसी पूर्णांक पर

void **(*(*weird)[6])(char, int); 

weird एक सूचक है, और प्रत्येक पॉइंटर को पॉइंटर पर शून्य करने के लिए लौटाता है।

अब आप जानते हैं कि यह क्या है और यह कैसे किया जाता है ... ऐसा नहीं करें। अधिक घोषणा योग्य हिस्सों में अपनी घोषणाओं को तोड़ने के लिए टाइपपीफ का उपयोग करें। जैसे

typedef void **(*sillyFunction)(char, int); 

sillyFunction (*weird)[6]; 
+0

और आजकल, किसी नाम पर किसी मानचित्र को मानचित्र बनाने के लिए 'उपयोग' का उपयोग करें। – IllidanS4

+0

वह सी ++ होगा ... – Artelius

+0

और आजकल, सी ++ का उपयोग करें :-P – IllidanS4

-1

आप एक सरणी है:

int myArray[5]; 
int * myArrayPtr = myArray; 

पूरी तरह से उचित नहीं होगा। myArray ब्रैकेट के बिना int पर एक सूचक है। जब आप ब्रैकेट जोड़ते हैं तो आप पॉइंटर myArray को अस्वीकार करते हैं। आप लिख सकते हैं ...

myArrayPtr[1] = 3; 

जो पूरी तरह से उचित है। कोष्ठक का उपयोग करना आईएमओ को पढ़ने और समझने के लिए चीजों को कठिन बनाता है। और वे दिखाते हैं कि लोग पॉइंटर्स, सरणी और पॉइंटर अंकगणित को नहीं समझते हैं, इस प्रकार संकलक या लिंकर एक से दूसरे में जाता है। ऐसा लगता है कि ब्रांड्स के साथ आपको बाध्य जांच मिलती है।

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