Pointer ke voidadalah tipe pointer "generik". A void *dapat dikonversikan ke jenis penunjuk lain apa pun tanpa gips eksplisit. Anda tidak dapat melakukan dereferensi void *atau melakukan aritmatika pointer dengan itu; Anda harus mengonversinya menjadi pointer ke tipe data yang lengkap terlebih dahulu.
void *sering digunakan di tempat-tempat di mana Anda harus dapat bekerja dengan tipe pointer yang berbeda dalam kode yang sama. Salah satu contoh yang sering dikutip adalah fungsi perpustakaan qsort:
void qsort(void *base, size_t nmemb, size_t size,
int (*compar)(const void *, const void *));
baseadalah alamat dari suatu array, nmembadalah jumlah elemen dalam array, sizeadalah ukuran dari setiap elemen, dan comparmerupakan penunjuk ke fungsi yang membandingkan dua elemen dari array. Disebut demikian:
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);
Ekspresi Array iArr, dArrdan lArrsecara implisit dikonversi dari jenis array ke jenis pointer dalam panggilan fungsi, dan masing-masing secara implisit dikonversi dari "pointer ke int/ double/ long" untuk "pointer ke void".
Fungsi perbandingan akan terlihat seperti:
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;
}
Dengan menerima void *, qsortdapat bekerja dengan array jenis apa pun.
Kerugian menggunakan void *adalah bahwa Anda membuang jenis keselamatan keluar jendela dan masuk lalu lintas yang akan datang. Tidak ada yang melindungi Anda dari menggunakan rutin perbandingan yang salah:
qsort(dArr, sizeof dArr/sizeof dArr[0], sizeof dArr[0], compareInt);
compareIntmengharapkan argumennya menunjuk ke ints, tetapi sebenarnya bekerja dengan doubles. Tidak ada cara untuk menangkap masalah ini pada waktu kompilasi; Anda hanya akan berakhir dengan array yang gagal.