2009-03-13 12 views
30

मैंने कुछ कोड देखा है, साथ ही साथ मेरे कंपाइलर से उत्पन्न कुछ त्रुटियां हैं जिनमें चर के पहले '**' टोकन है (उदाहरण के लिए ** variablename अप्रतिबंधित - या कुछ, मुझे बिल्कुल बंद नहीं किया जा सकता है)। मैं काफी हद तक निश्चित हूं कि यह पॉइंटर्स से संबंधित है, अगर मुझे लगता है कि ऐसा लगता है कि यह दो बार अस्वीकार करने की कोशिश कर रहा है। '**' काफी अप्राप्य है। क्या कोई मुझे एक अच्छी वेबसाइट/दस्तावेज़ीकरण के लिए इंगित कर सकता है या कोई इसे यहां समझाएगा?सी ++ में ** क्या है?

धन्यवाद।

ग्रेट प्रतिक्रियाएं। यदि मैं जोड़ सकता हूं, तो कुछ स्थितियां क्या होंगी जहां सूचक के लिए सूचक होना उपयोगी हो? क्या आप मूल सूचक को अभी तक एक और सूचक बनाने के बजाय मूल सूचक का उपयोग नहीं करना चाहिए?

+1

डुप्लिकेट: http://stackoverflow.com/questions/604099/what-is-double-star –

उत्तर

41

** वास्तव में सूचक के लिए सूचक नहीं है (घोषणापत्र के रूप में), लेकिन यह एक अव्यवस्था (एक बयान में) की कमी भी है।

यह अक्सर सी में उपयोग किया जाता है जिसमें & संदर्भों के लिए नोटेशन नहीं है, उदा। एक वापसी मान जो एक सूचक प्रकार है अद्यतन करने के लिए:

int alloc_foo(struct foo **foo_ret) 
{ 
    *foo_ret = malloc(sizeof(struct foo)); 
    return 1; /* to indicate success; return value in foo_ret */ 
} 
4

हो सकता है। यह बस * टोकन के बाद * टोकन है। आपके मामले में, आपके पास पॉइंटर के लिए पॉइंटर है, और इसे वास्तव में इंगित करने के लिए दो बार संदर्भित किया जा रहा है।

9

यह एक ** टोकन नहीं है -

यह आप यह सचमुच व्याख्या कर सकते हैं एक मैट्रिक्स (सरणियों की एक सरणी) या तार की एक सरणी (एक चार सरणी), आदि

1

एक सामान्य उपयोग यह सूचक शून्य पर सेट करने के लिए एक समारोह अनुमति देता है।
तो मुफ्त (सूचक) पॉइंटर को आवंटित स्मृति को मुक्त करता है लेकिन सूचक को खतरनाक रूप से मुक्त स्मृति पर इंगित करता है।
इसके बजाय my_free (** सूचक) घोषित करें और my_free (पॉइंटर) पर कॉल करें, इसलिए my_free() इसे मुक्त करने के बाद पॉइंटर को शून्य पर सेट कर सकता है।

6

यह एक डबल अव्यवस्था है।

int i = 3; 
int* ptr_to_i = &i; 
int** ptr_to_ptr_to_i = &ptr_to_i; 

std::cout << **ptr_to_ptr_to_i << std::endl; 

प्रिंटों 3.

4

मैं सिर्फ एक सूचक के सूचक के लिए उपयोग करता है में से कुछ को रेखांकित करना चाहता था देखें। इनमें से अधिकतर अन्य पोस्टों द्वारा छूए गए हैं, लेकिन मैंने सोचा कि पुनरावृत्ति मदद कर सकता है।

  • यह करने के लिए एक कॉल प्राप्त करने वाला संशोधित फोन करने वाले के स्वामित्व वाले एक सूचक अनुमति देता है। उदाहरण के लिए, कोई एक स्ट्रिंग की शुरुआत में पॉइंटर को पॉइंटर पास कर सकता है, और कैली पॉइंटर को संशोधित कर सकता है ताकि अब स्ट्रिंग के भीतर एक स्थिति को इंगित किया जा सके जहां एक विशेष चरित्र होता है।

  • क्योंकि सरणियों संकेत को नीचा (और संकेत दिए सरणियों के रूप में इलाज किया जा सकता), आप अक्सर एक सूचक एक सूचक को देखेंगे अगर आपके पास:

    • एक सरणी के लिए एक सूचक। यह उपरोक्त मामले का एक सामान्यीकरण है, क्योंकि "स्ट्रिंग" (एक सी-शैली स्ट्रिंग, वैसे भी) वास्तव में char एस की एक सरणी है।

    • पॉइंटर्स की एक सरणी। आप हो सकता है, उदाहरण के लिए, वस्तुओं के लिए संकेत की एक सरणी, है बहुरूपता के लिए अनुमति देता है, या संकेत की एक सरणी एक और संग्रह में संग्रहित वस्तुओं का चयन करने के लिए।

    • सरणी की एक सरणी। दोबारा, एरे पॉइंटर्स को गिरावट देते हैं, इसलिए यह उपरोक्त का एक विशिष्ट मामला है। इसका प्रयोग अक्सर तथाकथित "जाग्रत" सरणी (आयताकार के विपरीत) के लिए किया जाता है।

22

आप के लिए हस्ताक्षर पहचान सकते हैं मुख्य():

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

निम्नलिखित बराबर है:

int main(int argc, char** argv) 

इस मामले में, argv एक सरणी के लिए सूचक है चार * के।

सी में, इंडेक्स ऑपरेटर [] पॉइंटर अंकगणित करने का एक और तरीका है। उदाहरण के लिए,

foo[i] 

रूप

*(foo + i) 
3
  • int **var एक ही कोड का उत्पादन
  • **var संदर्भ एक सूचक की सामग्री है, जो अपने आप में एक सूचक
  • को इंगित करता है एक सूचक के लिए सूचक वाणी
0

यह सी ++ सिगिल के आकर्षण में से एक है। अपने स्वयं के व्यक्तिगत अनुभव से, मैं एसटीएल के Arrays & वेक्टरों पर डेरेंसेंस ऑपरेटरों का उपयोग करके तेज़ और अधिक कुशल रीड-एक्सेस प्रदर्शन को झुका सकता हूं। यदि आप उत्सुक हैं तो मैंने आदत साझा पॉइंटर विधियों को भी अपनाया है। :)

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