2012-04-27 8 views
18

क्रैपी शीर्षक के लिए खेद है, लेकिन मुझे नहीं पता कि इस समस्या का बेहतर वर्णन कैसे करें।सी ++ तारांकन और ब्रैकेट ऑपरेटर

int (*x)[]; 

और यह कैसे प्रारंभ करने में:

का अर्थ क्या है?

मैं जानता हूँ कि यह int *x[] के बाद से नहीं है:

int a,b; 
int (*x)[] = {&a, &b}; 

संकलन नहीं होंगे।

अग्रिम धन्यवाद।

int a[]; // conceptual: error if compiled 
x = &a; 

ध्यान दें कि सरणी के आकार का हिस्सा है:

declare x as pointer to array of int

तो तुम एक सरणी के पते के साथ x प्रारंभ कर सकते हैं:

उत्तर

25

प्रकार घोषणाओं एक अभिव्यक्ति की तरह वाक्य रचना है, तो आप के रूप में उन्हें पार्स तुम एक अभिव्यक्ति:

 x  x is 
    *x  a pointer 
    (*x)[] to an array of unknown dimensions 
int (*x)[] of int 

पूर्वता नियम यह है कि सही बाँध तंग से बाईं ओर उन लोगों के लिए ऑपरेटरों, प्रत्येक मामले में, ऑपरेटर तत्व तंग बांधता है, और अंत में, कि कोष्ठकों इन बाइंडिंग बदलने के लिए इस्तेमाल किया जा सकता है, तो के करीब:

int *x[]; is an array of pointers, 
int *(x[]); as is this. 
int (*x)[]; whereas here, the parentheses change the bindings. 
+1

+1 .... बहुत बढ़िया! – Nawaz

13

cdecl का उपयोग करना, आप आसानी से टाइप निर्धारित कर सकते हैं इसका प्रकार, इसलिए आप आकार N आकार के सरणी के पते को M के सरणी के लिए एक सूचक में निर्दिष्ट नहीं कर सकते, जहां N!=M (यह उपर्युक्त त्रुटि का कारण है: आपको सरणी के आकार को जानने की आवश्यकता है यह घोषणा करने के लिए)

int b[5]; 
int c[6]; 
int (*y)[6]; 
y = &b; // error 
y = &c; // OK 
+0

'cdecl' का उल्लेख करने के लिए Uptick - मैं इसे भूल गया था - हालांकि कड़ाई से, यह केवल सी वाक्यविन्यास का समर्थन करता है। –

+0

लिंक के लिए धन्यवाद, यह उपयोगी है! – Chlind

3

int (*x)[] एक खाली पूर्णांक सरणी के लिए सूचक के लिए इस्तेमाल करते हैं। लेकिन सी ++ में एक खाली सरणी संभव नहीं है। केवल आप इसे परिभाषित कर सकते हैं।

int a[2] = {1, 2}; 
int (*x)[2] = &a; 
+1

जीसीसी शिकायत करता है कि यह 'int (*) [2] 'से' int (*) [] 'को परिवर्तित नहीं कर सकता है। संपादित करें: अब यह प्रश्न से विचलित है;) – chris

+0

आप सही हैं, मैंने इसे सही किया। –

2

int (*x)[] मतलब है x सरणी int करने के लिए एक सूचक है: आप एक गैर खाली सरणी का उपयोग करना चाहिए। आप इस तरह कर सकते हैं:

int a[] = {1, 2}; 
int (* b)[2] = &a; 

जब सरणी टाइप चर व्याख्या की है, हम दाईं से बाईं ओर जाना चाहिए। जैसे

int *x[] 

इंगित करता है कि x एक सरणी, सरणी में तत्वों int * अर्थात सूचक int करने के लिए के रूप में लिखा गया है। इस प्रकार x एक सरणी का प्रतिनिधित्व करता है जिसका तत्व int सूचक है। हालांकि, कोष्ठक ऑपरेटर की प्राथमिकता बदलते हैं। अब * को पहली बार इंगित किया गया है कि x एक सूचक है, जिसका प्रकार int [] है। इस प्रकार, int (*x)[] में int सरणी के लिए एक सूचक है और आपको इसे तदनुसार प्रारंभ करना चाहिए।

+0

संकलित नहीं करता है: त्रुटि: असाइनमेंट में 'int (*) [2]' से 'int (*) []' को परिवर्तित नहीं कर सकता – Attila

+0

@ एटिला आपका कंपाइलर क्या है, 'gcc 4.1.2' पर ठीक काम करता है। :) –

+0

http : // ideone।कॉम/- मुझे लगता है कि यह पीठ में जीसीसी का उपयोग करता है, लेकिन मुझे नहीं पता कि कौन सा संस्करण/विकल्प – Attila

1

मैं सी टाइपिंग के साथ भी समस्याएं थीं, जब तक कि मैंने सीखा कि यह कैसे बनाया गया था।

सी में, इस प्रकार का एक चर का उपयोग करने के तरीके में वर्णन किया गया है।

इसलिए, जब आप देखते हैं:

int *x; 

इसका मतलब है कि अभिव्यक्ति *x प्रकार int की है, इसलिए x के प्रकार सूचक करने वाली पूर्णांक चर रहा है।

और अगर आप देखें:

int x[5]; 

इसका मतलब है कि अभिव्यक्ति x[3] प्रकार int की है, इसलिए x प्रकार सरणी के- int की एक चर है।

तो, आपकी अभिव्यक्ति को पाने के लिए:

int (*x)[]; 

इसका मतलब है कि अभिव्यक्ति *x प्रकार int[] की है (यानी, अज्ञात आकार के int की एक सरणी)। इसलिए x टाइप पॉइंटर-टू-ए-एरे-ऑफ-इंट का एक चर है।

+1

आप अनिवार्य रूप से सही हैं लेकिन आप और भी स्पष्ट हो सकते हैं। जब आप 'int * x' देखते हैं जिसका अर्थ है कि '* x' * एक प्रकार का चर * int है। जिस तरह से आपने यह कहा है, यह स्पष्ट नहीं है कि आपका मतलब है कि '* x' प्रकार int * या * चर * प्रकार int का * मान * था। –

+0

@EricLippert: '* x' एक चर नहीं है, यह एक अभिव्यक्ति है। मैंने भेद को चिह्नित करने के लिए सभी जगहों पर "अभिव्यक्ति" और "परिवर्तनीय" पेश किया और उम्मीद है कि चीजों को स्पष्ट बनाएं। –

+2

बेशक '* x' एक * चर * है; यह एक * भंडारण स्थान * का प्रतिनिधित्व करता है * * आप * को मान असाइन कर सकते हैं, इसलिए यह एक * चर * है; यह एक वैरिएबल * है * है: एक भंडारण स्थान जिसे आप मान असाइन कर सकते हैं। पाठ्यक्रम के सी प्रोग्रामर दुर्भाग्यपूर्ण "चर" की बजाय ऐसी चीजों को "lvalues" कहते हैं; "lvalue" भ्रमित और अनावश्यक रूप से "परिवर्तनीय" कहने के लिए शब्दकोष तरीका है। –

0

पूर्णांक (* x) [] इसका मतलब यह है एक्स एक पूर्णांक सरणी प्रारंभ करने में एक सूचक है के रूप में: पूर्णांक (* x) []; int एक [10]; x = & a;

पूर्णांक * x [] इसका मतलब यह है एक्स int करने के लिए संकेत की एक सरणी है पूर्णांक * x [10]; int एक [10]; एक्स [0] = ए;

मेरी राय में, हमेशा प्रारंभिक सरणी चर का उपयोग करें या * x [] के बजाय int ** x का उपयोग करें और फिर रनटाइम पर स्मृति आवंटित करें।

+0

पहला उपयोग उदाहरण संकलित नहीं करता है: त्रुटि: असाइनमेंट में 'int() [10]' to 'int() []' को परिवर्तित नहीं कर सकता – Attila