2016-02-25 12 views
5

मैं पॉइंटर्स के साथ काम कर रहा था और एक समस्या के साथ आया था। अब तक मुझे पता है कि जब हम किसी भी डेटा प्रकार की सरणी बनाते हैं, तो सरणी का नाम वास्तव में एक सूचक (शायद स्थैतिक सूचक) होता है जो सरणी की पहली अनुक्रमणिका की ओर इशारा करता है। सही बात?सरणी वीएस पॉइंटर-टू-पॉइंटर का पता: वही नहीं?

तो क्या मैं प्राप्त करने के लिए कोशिश कर रहा हूँ एक और सूचक है कि सरणी नाम का पता पकड़ सकता है बनाने के लिए है (यानी एक और सूचक जो मेरे मामले में सरणी नाम है की दिशा में एक सूचक)

उदाहरण के लिए:

char name[] = "ABCD"; // name holding the address of name[0] 
char *ptr1 = name;  // When this is possible 
char **ptr2 = &name; // Why not this. It give me error that cannot convert char(*)[5] to char** 

मैं आईडीई के रूप में कोड ब्लॉक का उपयोग कर रहा हूं।

+13

नहीं, नहीं, नहीं। कोई सरणी सूचक नहीं है। एक समारोह में पारित होने पर यह एक सूचक को क्षय हो सकता है लेकिन यह एक सूचक नहीं है। पॉइंटर्स के रूप में सरणी के बारे में मत सोचो। – NathanOliver

+1

तो आपका मतलब है जब मैंने char * ptr1 = name लिखा था; यह वास्तव में char * ptr1 = और नाम [0] किया था; ? और नाम खुद एक अलग सूचक चर नहीं है? –

+0

Arrays "सख्त" पॉइंटर्स नहीं हैं। सूचक कुछ स्मृति स्थान है जिसमें एक पता होता है। जब आप एक सरणी कंपाइलर का उपयोग करते हैं तो पता है कि इसका पता क्या है, लेकिन यह कहीं भी संग्रहीत नहीं है और इसे ओवरराइट नहीं किया जा सकता है। आपका दूसरा बयान इंगित करता है कि आप * ptr2 = somethingelse कर सकते हैं, जो नहीं किया जा सकता है। – nsilent22

उत्तर

8

टीएल; डीआर Arrays पॉइंटर्स नहीं हैं।

अपने कोड में, &nameकरने के लिए 5 char रों की सरणी सूचक है। यह पर पॉइंटर के समान नहीं है जो char पर एक सूचक है। आप (एक समारोह तर्क के रूप में एक सरणी गुजर उदाहरण के लिए,), सरणी नाम सूचक को decays कुछ मामलों में,

char (*ptr2)[5] = &name; 

या,

char (*ptr2)[sizeof(name)] = &name; 

FWIW करने के लिए अपने कोड को बदलने की जरूरत सरणी में पहला तत्व।

+0

क्या हमें 'sizeof (name)' का उपयोग नहीं करना चाहिए? – NathanOliver

+0

दो प्रश्न: 1) टीएल क्या है; डीआर और 2) क्या आपका मतलब 5 'चार' की सरणी थी? –

+0

@NathanOliver बेहतर एक, वास्तव में :) –

2

आप सूचक-टू-सूचक का उपयोग करना चाहते हैं, तो आप इस का उपयोग कर सकते हैं:

int main(void){ 
    char name[] = "ABCD"; 
    char *ptr1 = name; 
    char **ptr2 = &ptr1; 
    std::cout << *ptr1 << std::endl; 
    std::cout << **ptr2 << std::endl; 
} 

खुश होती है।

+0

हां, यह इस गड़बड़ी से बाहर निकलने का एक तरीका है, लेकिन मैं वास्तव में यह समझने की कोशिश कर रहा था कि मैं जो करने की कोशिश कर रहा हूं वह संभव नहीं है। –

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