2015-12-05 6 views
5

आमतौर पर जब आप (जैसे कि एक पूर्णांक के रूप में) एक सूचक की घोषणा आप इसे करने के लिए एक स्मृति पता निर्दिष्ट करना होगा: जब आप एक चार सूचक बनानेआप एक char सूचक को सरणी क्यों आवंटित कर सकते हैं?

int value = 123; 
int* p = &value; 

, आप एक चार सरणी इसे करने के लिए बिना प्रदान कर सकते हैं एक पता शामिल करने की आवश्यकता:

char* c = "Char Array"; 

यह कैसे काम करता है? क्या यह स्मृति आवंटित करता है और उस पर इंगित करता है? अन्य प्रकार के पॉइंटर्स एक ही काम क्यों नहीं कर सकते हैं?

+0

आप उदाहरण के लिए ऐसा नहीं कर सकते: 'char * c = &'a';' –

+0

ध्यान दें कि 'char * c =" char array "' C++ में संकलित नहीं होगा; क्या आप सी के बारे में पूछना चाहते थे? – edmz

+0

@ डैनियल आपका सी ++ कंपाइलर बेकार है अगर यह आपको कम से कम चेतावनी नहीं देता है। –

उत्तर

7

यह कैसे काम करता है?

स्ट्रिंग शाब्दिक निष्पादन योग्य फ़ाइल में केवल पढ़ने के लिए डेटा अनुभाग (अर्थात यह संकलन के दौरान आरंभ नहीं हो जाता) और c कि स्मृति स्थान को इंगित करने के आरंभ नहीं हो जाता में संग्रहित है। निहित array-to-pointer conversion बाकी को संभालता है।

ध्यान दें कि char* पर स्ट्रिंग अक्षर का रूपांतरण बहिष्कृत किया गया है क्योंकि सामग्री केवल पढ़ने के लिए ही होती है; स्ट्रिंग अक्षर को इंगित करते समय const char* पसंद करें।

एक संबंधित निर्माण, char c[] = "Char Array";, रनटाइम पर char सरणी के स्ट्रिंग अक्षर की सामग्री कॉपी करेगा।

अन्य प्रकार के पॉइंटर्स एक ही काम क्यों नहीं कर सकते हैं?

इस स्ट्रिंग शाब्दिक के लिए एक विशेष मामला है, सुविधा के लिए, सी

से विरासत में मिली
1

अन्य प्रकार संकेत दिए गए इस रूप में अच्छी तरह ठीक कर सकते हैं। एक स्ट्रिंग अक्षर अक्षर की सरणी है, इसलिए आपको सूचक को असाइन करने के लिए पता ऑपरेटर का उपयोग करने की आवश्यकता नहीं है।

आप एक पूर्णांक सरणी है, तो या तो पूर्णांक * या int [] क्या आप रूप में अच्छी तरह पता ऑपरेटर का उपयोग किए बिना सूचक int करने के लिए असाइन कर सकते हैं:

int intArray1[] = {0, 1, 2}; // fist array 
int * intArray2 = new int[10]; // second array 
// can assign without & operator 
int * p1 = intArray1; 
int * p2 = intArray2; 

char * कि स्ट्रिंग शाब्दिक प्रकार केवल विशिष्ट है वास्तव में const char * है और अभी भी असाइन करने की अनुमति है (बहिष्कृत रूपांतरण के बारे में चेतावनी के साथ)।

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