2013-04-10 13 views
5

तक पहुंचने के लिए मैं सी स्ट्रिंग्स की सरणी के लिए char ** क्यों इंगित नहीं कर सकता ??चार ** बनाम चार * सी [] स्ट्रिंग सरणी

int main(int argc, char *argv[]) { 

    char* c1[] = {"Hey","Hello"}; 
    printf("%s",c1[1]); 

} //works fine 

बनाम

int main(int argc, char *argv[]) { 

    char** c1 = {"Hey","Hello"}; 
    printf("%s",c1[1]); 

} //error 
+6

पॉइंटर्स सरणी नहीं हैं। –

उत्तर

6

मुझे लगता है कि यहां भ्रम इस विश्वास से उत्पन्न होता है कि {"Hey","Hello"} एक सरणी है। यह। यह बिल्कुल एक वस्तु नहीं है। यह सिर्फ एक विशेष प्रारंभकर्ता वाक्यविन्यास है जिसे किसी सरणी को प्रारंभ करने के लिए उपयोग किया जा सकता है। आप इसे char** प्रारंभ करने के लिए उपयोग नहीं कर सकते क्योंकि char** एक सूचक है, एक सरणी नहीं है। यह स्वचालित रूप से एक सरणी ऑब्जेक्ट नहीं बनाता है जिसे आप एक सूचक में परिवर्तित कर सकते हैं।

शायद आप इसे पाइथन में [...] सूची या जावास्क्रिप्ट में { ... } ऑब्जेक्ट की तरह सोच रहे थे। यह बिल्कुल पसंद नहीं है। वे अभिव्यक्ति वास्तव में उस प्रकार की वस्तुओं को बनाते हैं और उन अभिव्यक्तियों में कहीं भी इस्तेमाल किए जा सकते हैं जो उन वस्तुओं को ले सकते हैं।सी ++ में हम जिस वाक्यविन्यास का उपयोग कर रहे हैं वह है प्रारंभिक वाक्यविन्यास।

उदाहरण के लिए, आप ऐसा कर सकता है:

const char* array[] = {"Hey","Hello"}; 
const char** p = array; 

हालांकि, आप कुछ इस तरह मूर्ख नहीं कर सकते:

std::cout << {"Hey", "Hello"}[1]; 

यहाँ हम वास्तव में सरणी वस्तु बनाया है, जिसमें पॉइंटर्स संग्रहित किया जाएगा। तभी हम उस सरणी को const char** में परिवर्तित कर सकते हैं।

+0

बहुत स्पष्ट..thanxxx – tez

1

क्यों मैं सी तार के सरणी के लिए एक char** बात नहीं कर सकते?

जैसा कि आपने कहा था, c1 एक सरणी है। तो आपको इसे पॉइंटर्स के char पर घोषित करना होगा।

के बाद से "Hey" और "Hello"स्ट्रिंग litterals हैं, प्रत्येक c1[i] स्ट्रिंग एक गुमनाम स्ट्रिंग के लिए ओर इशारा करते हुए है। यही कारण है कि आप char के सरणी के बजाय पॉइंटर्स का उपयोग char पर कर सकते हैं।

char पर पॉइंटर्स की एक सरणी बनाने के लिए, हालांकि, आप char ** का उपयोग नहीं कर सकते हैं।

0

"चार ** c1" करने के लिए, संकलक यह प्रकार चार के लिए एक सूचक के लिए सूचक है कि बताता है, अदिश प्रकार (एक मूल्य) है।

मूल्यों की सूची के साथ आरंभ करना केवल कुल प्रकार के लिए काम करता है।

+0

'char ** c1' में कोई अस्पष्टता नहीं है। यह 'char' के लिए एक सूचक के लिए एक सूचक है। (बेशक, उपर्युक्त में दोनों पॉइंटर्स सरणी के पहले तत्व के लिए हो सकते हैं।) –

+0

@ जेम्स कानज़, हाँ, मेरी गलती। इसे हटा दिया – Arun

0
int main(int argc, char *argv[]) { 

    char** c1 = {"Hey","Hello"}; 
    printf("%s",c1[1]); 

} //error 

उपरोक्त कोड में, आप दो तारों के सेट पर पॉइंटर को पॉइंटर सेट करने का प्रयास कर रहे हैं। दो बिंदुओं के लिए भंडारण कहां है जिसमें "हे" और "हैलो" का पता क्रमशः है? कहीं भी नहीं।

आप कर सकता है:

char *a = "Hey"; 
char *b = "Hello"; 
char *c[] = { a, b };  // This MAY not compile due to a and b not being compile time constants. 
char **c1 = c; 

(मैं और अधिक अलग-अलग चर में इसे विभाजित कर दिया है यह वास्तव में जरूरत है की तुलना में है, लेकिन मैं यह बताता है कि आपके कोड के साथ "गलत" काफी स्पष्ट रूप है लगता है)।

const int a = 1; 
const int b = 2; 

int c[] = { a, b }; 

int *c = { a, b }; // Doesn't work, there is nowhere to store a copy of a and b. 

यह एक ही बात है पूर्णांकों के साथ छोड़कर:

एक और उदाहरण है कि अगर हम char * बदलने int करने के लिए किया जाएगा।

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