2011-12-16 21 views
57

संभव डुप्लिकेट:
What is a void pointer and what is a null pointer?सी ++ में शून्य सूचक क्या है?

मैं अक्सर कोड है जो निम्न की तरह कुछ मिलता-जुलता देखें:

void * foo(int bar);

इसका क्या मतलब है? क्या इसका मतलब यह है कि यह कुछ भी वापस कर सकता है? क्या यह dynamic या object सी # में समान है?

+0

इसी तरह के प्रश्न का एक लिंक: http://stackoverflow.com/questions/4334831/what-is-a-void-pointer-and-what-is-a-null-pointer – ksming

+0

इसका गतिशीलता के साथ कोई संबंध नहीं है 'और 'ऑब्जेक्ट' के साथ केवल एक सकल" समानता "है। –

उत्तर

69

void* का कोई मतलब नहीं है। यह एक सूचक है, लेकिन जिस प्रकार से यह इंगित करता है वह ज्ञात नहीं है।

ऐसा नहीं है कि यह "कुछ भी" वापस कर सकता है। एक समारोह है कि एक void* रिटर्न आम तौर पर निम्न में से एक है:

  • यह अस्वरूपित स्मृति में काम कर रहा है। यह operator new और malloc रिटर्न है: एक निश्चित आकार की स्मृति के ब्लॉक के लिए एक सूचक। चूंकि स्मृति में कोई प्रकार नहीं है (क्योंकि इसमें अभी तक एक उचित रूप से निर्मित ऑब्जेक्ट नहीं है), यह टाइपलेस है। आईई: void
  • यह एक अपारदर्शी संभाल है; यह एक विशिष्ट प्रकार का नाम दिए बिना एक निर्मित वस्तु का संदर्भ देता है। कोड जो यह आम तौर पर खराब रूप से गठित होता है, क्योंकि यह बेहतर रूप से एक संरचना/कक्षा घोषित करके और इसके लिए सार्वजनिक परिभाषा प्रदान नहीं कर रहा है। क्योंकि तब, कम से कम यह एक वास्तविक प्रकार है।
  • इसमें स्पष्ट दस्तावेज है जो आपको बता रहा है कि किस प्रकार के लिए आप पॉइंटर का उपयोग कर सकते हैं।

यह कुछ भी नहीं सी # में dynamic या object की तरह है। उन संरचनाओं को वास्तव में पता है कि मूल प्रकार क्या है; void* नहीं है। यह उनमें से किसी से भी ज्यादा खतरनाक बनाता है, क्योंकि इसे गलत करना बहुत आसान है।

और व्यक्तिगत नोट पर, यदि आप void* "अक्सर" का उपयोग करते हुए कोड देखते हैं, तो आपको उस कोड पर पुनर्विचार करना चाहिए जिसे आप देख रहे हैं। void* उपयोग, विशेष रूप से सी ++ में, दुर्लभ, कच्चे मेमोरी में काम करने के लिए प्राथमिक इस्तेमाल किया जाना चाहिए।

+0

शून्य * की तुलना में धन्यवाद +1 * सी #/जावा 'ऑब्जेक्ट' – KGCybeX

4

एक शून्य * कुछ भी इंगित कर सकता है (यह किसी भी प्रकार की जानकारी के बिना कच्चे सूचक है)।

+7

कोई भी सूचक कुछ भी इंगित कर सकता है। –

22

void* पॉइंटर का उपयोग तब किया जाता है जब आप प्रकार निर्दिष्ट किए बिना स्मृति के एक हंक में सूचक इंगित करना चाहते हैं। सी का malloc ऐसा पॉइंटर लौटाता है, जिससे आप इसे किसी विशेष प्रकार पर तुरंत डालने की उम्मीद कर सकते हैं। यह वास्तव में उपयोगी नहीं है जब तक आप इसे किसी अन्य सूचक प्रकार पर नहीं डाल देते। आपको यह जानने की उम्मीद है कि इसे किस प्रकार कास्ट करना है, संकलक के पास अंतर्निहित प्रकार होना चाहिए, यह जानने के लिए कोई प्रतिबिंब क्षमता नहीं है।

+0

खैर, सी का 'मॉलोक' वास्तव में आपको उम्मीद नहीं करता है कि आप इसे किसी अन्य चीज़ पर तुरंत डालें, क्योंकि सी में, 'शून्य *' को वास्तविक सूचक प्रकार में स्वचालित रूप से प्रचारित किया जाता है: http://stackoverflow.com/q/605845/ 837,703। सी ++ एक अलग कहानी है, लेकिन आप वैसे भी सी ++ में 'नया' का उपयोग कर रहे हैं। –

+1

@ अरका मजूमदार एक निहित कलाकार अभी भी एक कलाकार है। पॉइंटर परिवर्तन का प्रकार, जो कि यह उपयोगी होने की अनुमति देता है। –

20

शून्य का उपयोग कीवर्ड के रूप में किया जाता है। शून्य पॉइंटर, जेनेरिक पॉइंटर के रूप में भी जाना जाता है, एक विशेष प्रकार का पॉइंटर है जिसे किसी भी डेटा प्रकार की वस्तुओं पर इंगित किया जा सकता है! एक शून्य सूचक एक सामान्य सूचक की तरह घोषित किया जाता है, सूचक के प्रकार के रूप में शून्य कीवर्ड का उपयोग:

जनरल सिंटेक्स:

int nValue; 
float fValue; 

struct Something 
{ 
    int nValue; 
    float fValue; 
}; 

Something sValue; 

void *pVoid; 
pVoid = &nValue; // valid 
pVoid = &fValue; // valid 
pVoid = &sValue; // valid 
:

void* pointer_variable; 

void *pVoid; // pVoid is a void pointer 

एक शून्य सूचक किसी भी डेटा प्रकार की वस्तुओं को इंगित कर सकते हैं

हालांकि, क्योंकि शून्य सूचक नहीं जानता कि यह किस प्रकार की ऑब्जेक्ट इंगित कर रहा है, इसे अस्वीकार नहीं किया जा सकता है! इसके बजाय, शून्य सूचक को पहले इसे संदर्भित करने से पहले किसी अन्य सूचक प्रकार को स्पष्ट रूप से डाला जाना चाहिए।

int nValue = 5; 
void *pVoid = &nValue; 

// can not dereference pVoid because it is a void pointer 

int *pInt = static_cast<int*>(pVoid); // cast from void* to int* 

cout << *pInt << endl; // can dereference pInt 
+4

सी ++ में उन अंतिम तीन पंक्तियों में संकलन त्रुटि होगी क्योंकि आपको सी के विपरीत, चीजों को स्पष्ट रूप से 'शून्य *' पर डालना होगा। –

+0

@ उपयोगकर्ता 1 9 88 कृपया अपनी पोस्ट को संपादित करने का तरीका जानें। –

+0

वर्तमान में कोड उदाहरण आपको धन्यवाद देता है। मेरे लिए यह प्रश्न और शीर्ष 2 उत्तरों लिंक किए गए "डुप्लिकेट" की तुलना में अधिक संक्षिप्त और इंगित हैं। – Garrick

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