পয়েন্টারটি 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, তবে আসলে doubleএস এর সাথে কাজ করছে । সংকলনের সময় এই সমস্যাটি ধরার কোনও উপায় নেই; আপনি কেবল একটি মিসরেড অ্যারে দিয়ে শেষ করবেন।