एक सूचक void"जेनेरिक" सूचक प्रकार है। एक 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, लेकिन वास्तव में doubles के साथ काम कर रहा है । संकलन समय पर इस समस्या को पकड़ने का कोई तरीका नहीं है; तुम बस एक गलत सरणी के साथ हवा हूँ।