void
पर एक सूचक "जेनेरिक" सूचक प्रकार है। एक void *
किसी भी अन्य सूचक प्रकार में एक स्पष्ट कलाकार के बिना परिवर्तित किया जा सकता है। आप void *
को अस्वीकार नहीं कर सकते हैं या इसके साथ पॉइंटर अंकगणित नहीं कर सकते हैं; आपको इसे एक पॉइंटर में पहले एक पूर्ण डेटा प्रकार में परिवर्तित करना होगा।
यह उन स्थानों पर उपयोग किया जाता है जहां आपको एक ही कोड में विभिन्न सूचक प्रकारों के साथ काम करने में सक्षम होना चाहिए। एक आमतौर पर उद्धृत उदाहरण लाइब्रेरी समारोह qsort
है:
void qsort(void *base, size_t nmemb, size_t size,
int (*compar)(const void *, const void *));
base
एक सरणी का पता है, nmemb
सरणी में तत्वों की संख्या है, size
प्रत्येक तत्व का आकार है, और compar
एक करने के लिए एक सूचक है फ़ंक्शन जो सरणी के दो तत्वों की तुलना करता है।यह बहुत की तरह कहा जाता हो जाता है:
int iArr[10];
double dArr[30];
long lArr[50];
...
qsort(iArr, sizeof iArr/sizeof iArr[0], sizeof iArr[0], compareInt);
qsort(dArr, sizeof dArr/sizeof dArr[0], sizeof dArr[0], compareDouble);
qsort(lArr, sizeof lArr/sizeof lArr[0], sizeof lArr[0], compareLong);
सरणी भाव iArr
, dArr
, और lArr
परोक्ष समारोह कॉल में प्रकार सूचक को सरणी प्रकार से बदल रहे हैं, और प्रत्येक परोक्ष int
/double
/long
करने के लिए "सूचक से बदल जाती है "टू पॉइंटर टू void
"।
तुलना कार्यों कुछ ऐसा दिखाई देगा:
int compareInt(const void *lhs, const void *rhs)
{
const int *x = lhs; // convert void * to int * by assignment
const int *y = rhs;
if (*x > *y) return 1;
if (*x == *y) return 0;
return -1;
}
void *
, qsort
को स्वीकार करने में किसी भी प्रकार की सरणियों के साथ काम कर सकते हैं के द्वारा।
void *
का उपयोग करने का नुकसान यह है कि आप खिड़की से बाहर आने वाले यातायात में सुरक्षा को फेंक देते हैं। वहाँ गलत तुलना दिनचर्या का उपयोग कर से बचाने के लिए कुछ भी नहीं है:
qsort(dArr, sizeof dArr/sizeof dArr[0], sizeof dArr[0], compareInt);
compareInt
अपने तर्कों int
रों की ओर इशारा करते जा करने के लिए उम्मीद कर रही है, लेकिन वास्तव में double
के साथ काम कर रहा है। संकलन समय पर इस समस्या को पकड़ने का कोई तरीका नहीं है; आप बस एक गलत प्रकार की सरणी के साथ हवादार हो जाएगा।
आप किस सी पुस्तक का उपयोग कर रहे हैं? आप एक पूरे अध्याय के बेहतर हिस्से के लिए पूछ रहे हैं। – cnicutar
http://stackoverflow.com/questions/692564/concept-of-void-pointer-in-c-programming – WDan
पर एक बार देखें: http://stackoverflow.com/questions/1043034/what-does -वोइड-माध्य-इन-सीसी-एंड-सी और यहां: http://stackoverflow.com/questions/7324860/using-void-in-c – d33pika