फू (शून्य) बनाम फू (शून्य *)


9

कार्यात्मक और वाक्यात्मक रूप से, क्या किसी फ़ंक्शन के बीच अंतर होता है जिसका प्रोटोटाइप int foo(void)और है int foo(void *)?

मैं उदाहरण के लिए, के बीच का अंतर जानता हूं, int bar(int)और int bar(int *)- उनमें से एक इंट की तलाश कर रहा है, और दूसरा एक इंट्री पॉइंटर की तलाश में है। voidउसी तरह व्यवहार करता है ?


संबंधित प्रश्न का उत्तर: stackoverflow.com/a/1043209/434551
आर साहू


क्या और अधिक दिलचस्प हो सकता है के बीच अंतर है foo(void)और foo()
मैक्सिम एगोरुस्किन

जवाबों:


10

सॉफ्टवेयर इंजीनियरिंग पर इस उत्तर से ,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 *फ़ंक्शन प्रोटोटाइप में इसका मतलब है "सूचक इस फ़ंक्शन में दिए गए डेटा में एक ज्ञात प्रकार नहीं है" और एक पैरामीटर या रिटर्न मान इंगित करता है जिसका पॉइंटर किसी दूसरे प्रकार का होना चाहिए, इससे पहले कि पॉइंटर का डेटा इस्तेमाल किया जा सके।


void * ... must be cast to another type first, but may be done so without an explicit cast.C ++ में सही नहीं है। C ++ में रूपांतरण फ़ॉर्म void*स्पष्ट होना चाहिए। पुनश्च एक कास्ट को स्पष्ट कॉल निरर्थक है क्योंकि कास्ट एक स्पष्ट रूपांतरण है।
इरोरिका

C / C ++ अंतर को प्रतिबिंबित करने के लिए अपडेट किया गया, मुझे बताने के लिए धन्यवाद!
निक रीड

4

foo(void) - कोई मापदंडों के साथ कार्य

foo(void *)- एक void *पैरामीटर के साथ कार्य करें

क्या है void *? यह केवल निर्दिष्ट प्रकार के साथ डेटा के लिए सूचक है। इसे किसी अन्य पॉइंटर टाइप पर डाला जा सकता है

unsigned add(void *arr)
{
   unsigned *uarr = arr;
   return uarr[0] + uarr[1];
}

आवश्यक उत्तर, इसलिए यह सबसे अच्छा है। मैं सिर्फ यह कहना चाहूंगा कि यह कैसे (type) vs. (type *)जोड़े ब्रह्मांड में एक अपवाद है क्योंकि शून्य वास्तव में एक प्रकार नहीं है।
रॉबर्टो कैबोनी

2

कार्यात्मक और वाक्यात्मक रूप से, क्या किसी फ़ंक्शन के बीच अंतर है जिसका प्रोटोटाइप int foo (void) और int foo (void *) है?

इसमे अंतर है:

int foo(void) एक ऐसे समारोह की घोषणा करता है जो कोई तर्क स्वीकार नहीं करता।

int foo(void *)एक प्रकार का तर्क स्वीकार करने वाले फ़ंक्शन की घोषणा करता है void*

C ++ में, int foo(void)के बराबर है int foo()

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.