2012-08-08 9 views
6
typedef char* c; 
const c ptr1 = "pointer"; 
++ptr1; /// error 
const char* ptr2 = "pointer"; 
++ptr2; /// runs fine 

अब ptr1const char* प्रकार और इस प्रकार एक गैर-कॉन्स्ट पॉइंटर होना चाहिए, तो इसे निरंतर सूचक के रूप में क्यों माना जा रहा है?टाइपपीफ का उपयोग करते समय गैर-कॉन्स पॉइंटर को कॉन्स्ट के रूप में क्यों माना जाता है?

उत्तर

13

वे समान नहीं हैं।

पहला कॉन्स्ट-पॉइंटर-टू-चार नामित करता है, दूसरा पॉइंटर-टू-कॉन्स्ट-चार है।

दाएं से बाएं पढ़ने का प्रयास करें:

const char *p; // p is a pointer to char which is const 
char const *p; // p is a pointer to const char (same as previous) 
char * const p; // p is a const pointer to char 
char const * const p; // p is a const pointer to const char 

एक भी उर्फ ​​c में typedef typedef char* c "चार सूचक" का उपयोग कर आप अर्थ पैक द्वारा:

const c p; // p is a const [c] --> p is a const [pointer to char] 

अतिरिक्त स्पष्टीकरण :

typedefs में जगह-विस्तार नहीं कर रहे हैं मैक्रो नहीं है की तरह है, यानी

const c p; 

वास्तव में हो जाता है

const [char*] p; 

यह नहीं बन जाता है

const char* p; // Nope. 

यह मैक्रो की तरह का विस्तार न करें आपके दिमाग में, टाइपपीफ के साथ, आपने char और * को एक साथ बांध लिया है और एक परमाणु बनाया है। जबकि ptr2 एक (const char) * है स्थिरांक है, सूचक का लक्ष्य अर्थ

+0

यह दिलचस्प है के रूप में ही होना चाहिए। मैं वास्तव में हैरान हूँ। +1 –

+1

मुझे पता है, लेकिन जब इसे कंपाइलर द्वारा * कॉन्स char * * के रूप में नहीं माना जाना चाहिए, क्योंकि * सी * * char * * में विस्तारित किया जा रहा है, यही वह है जो मैं पूछ रहा हूं। – cirronimbo

+0

@cirronimbo: मेरे उत्तर में "टाइपपीफ का उपयोग करके" अनुभाग देखें। –

3

ptr1 एक const (char *) है, जिसका अर्थ सूचक अपने आप में एक स्थिरांक है।

0

इसे सी समूह की आंतरिक रूप से इस तरह से करना है। एक टाइपिफ़ एक मैक्रो की तरह नहीं है, यह केवल चीजों को प्रतिस्थापित नहीं करता है। अगर आप इसमें ब्रूस कोष्ठक बनाना चाहते हैं तो ऐसा दिखाई देगा।

const (char*) ptr1 = "pointer"; 
(const char)* ptr2 = "pointer"; 
0

है जैसे कि यह लेखन:

typedef char* c; 
c const ptr1 = "pointer"; 
++ptr1; /// error 
char const* ptr2 = "pointer"; 
++ptr2; /// runs fine 

अंतर अधिक दिखाई देता है, और यह अपने उदाहरण