2013-06-07 11 views
13

सी के लिए नया होने के नाते, शून्य पॉइंटर्स से प्राप्त एकमात्र व्यावहारिक उपयोग बहुमुखी कार्यों के लिए है जो किसी दिए गए पॉइंटर में विभिन्न डेटा प्रकारों को स्टोर कर सकता है। इसलिए स्मृति आवंटन करते समय मैंने अपने सूचक को टाइप-कास्ट नहीं किया।क्यों एक शून्य सूचक डालना टाइप करें?

मैंने कुछ कोड उदाहरण देखे हैं जो कभी-कभी शून्य पॉइंटर्स का उपयोग करते हैं, लेकिन उन्हें टाइप-कास्ट मिलता है। यह उपयोगी क्यों है? एक शून्य के बजाय सीधे वांछित प्रकार के सूचक क्यों नहीं बनाते?

void some_function(void * some_param) { 
    int some_value = *some_param; /* won't work, you can't dereference a void pointer */ 
} 

void some_function(void * some_param) { 
    int some_value = *((int *) some_param); /* ok */ 
} 
+6

क्या आप एक उदाहरण दिखा सकते हैं? –

+3

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

+0

यदि आप इसकी संरचना तक पहुंचना चाहते हैं तो आपको एक शून्य पॉइंटर डालना होगा। (संरचना) –

उत्तर

6

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

typedef struct CombinedData 
{ 
    int memberA; 
    double memberB; 
} CombinedData; 

void fun(void* data) 
{ 
    CombinedData* p = (CombinedData*)data; 
    doSomethingWith(p->memberA, p->memberB);   
} 
+1

आपको * की आवश्यकता नहीं है; * ए अधिक पठनीय (मेरे द्वारा पसंदीदा) दृष्टिकोण 'int * tmp = param है; int val = * tmp; '। –

+0

@ एच 2CO3 आपको पॉइंटर एक शून्य प्रकार है तो आपको करना होगा। जैसा कि गिलाउम के उदाहरण में है। –

+1

@Armin आपको ** ** नहीं करना है, ** मैं दोहराना चाहता हूं - यदि आप पॉइंटर को अस्थायी रूप से असाइन करते हैं तो कास्ट से बचा जा सकता है। –

1

आपका शून्य:

+2

जैसा कि अन्य लोगों ने पहले ही कहा है, आपको असाइनमेंट से पहले अपने 'डेटा' को स्पष्ट रूप से डालना नहीं है। एक और मुद्दा यह है कि आपका कोड * सी * कंपाइलर (सी ++ एक नहीं) के लिए टूटा हुआ है: 'संयुक्त डेटा * पी' →' संरचना संयुक्त डेटा * पी'। – firegurafiku

+1

@firegurafiku एक बहुत अच्छा बिंदु है मैं एक टाइपेड-एड संरचना का उपयोग करने के लिए पोस्ट अद्यतन करेंगे। यह एक लंबा समय था जब मैंने इसका उत्तर दिया और मुझे याद नहीं आया कि अगर मैंने यह भी देखा कि यह सी था और सी ++ प्रश्न नहीं था। – DuncanACoulter

12

वहाँ सी

  1. में अन्य प्रकार के एक शून्य सूचक कास्टिंग के लिए दो कारण आप आप वास्तव में कर रहे हैं सूचक (*(int*)p = 42)
  2. से कुछ की ओर इशारा किया जा रहा है पर पहुंचना चाहते हैं कर रहे हैं "वास्तविक" सी के बजाय सी और सी ++ के सामान्य उप-समूह में कोड लिखना। Do I cast the result of malloc?

1 का कारण स्पष्ट होना चाहिए। नंबर दो इसलिए है क्योंकि सी ++ void* से दूसरे प्रकार के अंतर्निहित रूपांतरण को अस्वीकार करता है, जबकि सी इसे अनुमति देता है।

+1

लेकिन तर्क 2 अमान्य है: किसी को C++ संकलक के साथ सी कोड संकलित नहीं करना चाहिए। –

+5

@ H2Co3: सच है, लेकिन कभी-कभी आपके पास मैक्रोज़ या इनलाइन फ़ंक्शंस में हेडर फ़ाइलों में परिभाषित कोड होता है जो कि सी और सी ++ कोड दोनों में उपयोग करने योग्य होता है जिसमें वे शीर्षलेख शामिल होते हैं। –

+1

@ एच 2CO3 फिर भी, कुछ लोग इसे करते हैं। मैं इस घटना को समझाने की कोशिश कर रहा था, इसे उचित ठहराना नहीं था। – wolfgang

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