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