सॉफ्टवेयर इंजीनियरिंग पर इस उत्तर से ,void
इसका उपयोग कैसे किया जाता है, इसके आधार पर विशेष रूप से व्यवहार किया जाता है। में C
और C++
, void
इंगित करने के लिए प्रयोग किया जाता है , कोई डेटा प्रकार का अभाव है, जबकि void *
एक इंगित करने के लिए प्रयोग किया जाता है सूचक स्मृति में कुछ डेटा / अंतरिक्ष कि एक प्रकार नहीं है जो करने के लिए अंक। void *
अपने दम पर dereferenced नहीं जा सकता है, और पहले दूसरे प्रकार के लिए डाला जाना चाहिए। इस कास्ट को स्पष्ट नहीं किया C
जाना चाहिए, लेकिन इसमें स्पष्ट होना चाहिए C++
। (यही कारण है कि हमने मॉलॉक का रिटर्न वैल्यू नहीं डाला है, जो है void *
।)
जब एक फ़ंक्शन के साथ एक पैरामीटर के रूप में उपयोग किया जाता है, तो void
किसी भी पैरामीटर की कुल अनुपस्थिति का मतलब है, और केवल अनुमत पैरामीटर है। एक चर प्रकार की तरह शून्य का उपयोग करने का प्रयास करना या संकलक त्रुटि में अन्य तर्क परिणाम शामिल करना:
int foo(void, int); //trying to use "void" as a parameter
int bar(void baz); //trying to use "void" as an argument's type
main.c:1:8: error: 'void' must be the first and only parameter if specified
int foo(void, int);
^
main.c:2:14: error: argument may not have 'void' type
int bar(void baz);
^
प्रकार के साथ एक वैरिएबल घोषित करना असंभव है void
:
int main(void) {
void qux; //trying to create a variable with type void
}
main.c:5:8: error: variable has incomplete type 'void'
void qux;
void
किसी फ़ंक्शन के लिए वापसी मान के रूप में इंगित करता है कि कोई डेटा वापस नहीं किया जाएगा। चूंकि एक प्रकार के चर को घोषित void
करना असंभव है void
, एक फ़ंक्शन के रिटर्न मान को पकड़ना असंभव है , यहां तक कि एक शून्य पॉइंटर के साथ भी।
void foo(int i) { return; }
int main(void) {
void *j;
j = foo(0);
return 0;
}
main.c:5:5: error: assigning to 'void *' from
incompatible type 'void'
j = foo(0);
^ ~~~~~~
टाइपलेस void *
एक अलग मामला है। एक शून्य पॉइंटर एक पॉइंटर को मेमोरी में किसी स्थान पर इंगित करता है, लेकिन उस पॉइंटर पर डेटा के प्रकार को इंगित नहीं करता है। (यह C में बहुरूपता को प्राप्त करने के लिए उपयोग किया जाता है , जैसे कि qsort () फ़ंक्शन के साथ ।) ये पॉइंटर्स उपयोग करने के लिए मुश्किल हो सकते हैं, हालांकि, गलती से उन्हें गलत प्रकार से डालना बहुत आसान है। नीचे दिए गए कोड में कोई संकलक त्रुटियां नहीं डाली जाएंगी C
, लेकिन अपरिभाषित व्यवहार के परिणामस्वरूप:
#include <stdio.h>
int main(void) {
double foo = 47.2; //create a double
void *bar = &foo; //create a void pointer to that double
char *baz = bar; //create a char pointer from the void pointer, which
//is supposed to hold a double
fprintf(stdout, "%s\n", baz);
}
हालांकि, निम्नलिखित कोड पूरी तरह से कानूनी है; एक शून्य पॉइंटर से कास्टिंग और मान कभी नहीं बदलता है।
#include <stdio.h>
int main(void) {
double foo = 47.2;
void *bar = &foo;
double *baz = bar;
fprintf(stdout, "%f\n", *baz);
}
47.200000
एक फ़ंक्शन पैरामीटर के रूप में, void *
इंगित करता है कि आपके द्वारा पास किए जा रहे पॉइंटर के डेटा का प्रकार ज्ञात नहीं है, और यह आपके ऊपर है, प्रोग्रामर, उस मेमोरी लोकेशन पर जो कुछ भी है उसे ठीक से संभालने के लिए। वापसी मूल्य के रूप में, void *
इंगित करता है कि लौटाए जा रहे डेटा का प्रकार ज्ञात नहीं है या टाइप नहीं है, और इसे प्रोग्राम द्वारा नियंत्रित किया जाना चाहिए।
int quux(void *); //a function that receives a pointer to data whose type is not known, and returns an int.
void *quuz(int); //a function that receives an int, and returns a pointer to data whose type is not known.
void
एक फ़ंक्शन प्रोटोटाइप में tl; dr का अर्थ है "कोई डेटा नहीं" और कोई रिटर्न मान या कोई पैरामीटर नहीं दर्शाता है, void *
फ़ंक्शन प्रोटोटाइप में इसका मतलब है "सूचक इस फ़ंक्शन में दिए गए डेटा में एक ज्ञात प्रकार नहीं है" और एक पैरामीटर या रिटर्न मान इंगित करता है जिसका पॉइंटर किसी दूसरे प्रकार का होना चाहिए, इससे पहले कि पॉइंटर का डेटा इस्तेमाल किया जा सके।