Ein Zeiger auf voidist ein "generischer" Zeigertyp. A void *kann ohne explizite Umwandlung in einen anderen Zeigertyp konvertiert werden. Sie können eine dereferenzieren void *oder eine Zeigerarithmetik damit durchführen. Sie müssen es zuerst in einen Zeiger auf einen vollständigen Datentyp konvertieren.
void *wird häufig an Stellen verwendet, an denen Sie in der Lage sein müssen, mit verschiedenen Zeigertypen im selben Code zu arbeiten. Ein häufig genanntes Beispiel ist die Bibliotheksfunktion qsort:
void qsort(void *base, size_t nmemb, size_t size,
int (*compar)(const void *, const void *));
baseist die Adresse eines Arrays, nmembist die Anzahl der Elemente im Array, sizeist die Größe jedes Elements und comparist ein Zeiger auf eine Funktion, die zwei Elemente des Arrays vergleicht. Es wird so genannt:
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);
Die Array - Ausdrücke iArr, dArrund lArrimplizit von Array - Typ auf Zeiger Typen in dem Funktionsaufruf umgewandelt, und jedes ist implizit aus „Zeigern auf umgewandelt int/ double/ long“ auf „Zeiger void“.
Die Vergleichsfunktionen würden ungefähr so aussehen:
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;
}
Durch die Annahme void *, qsortkann mit Arrays jeder Art arbeiten.
Der Nachteil der Verwendung void *ist, dass Sie die Typensicherheit aus dem Fenster in den Gegenverkehr werfen. Es gibt nichts, was Sie davor schützen könnte, die falsche Vergleichsroutine zu verwenden:
qsort(dArr, sizeof dArr/sizeof dArr[0], sizeof dArr[0], compareInt);
compareInterwartet, dass seine Argumente auf ints verweisen, arbeitet aber tatsächlich mit doubles. Es gibt keine Möglichkeit, dieses Problem beim Kompilieren zu beheben. Sie werden nur mit einem falsch sortierten Array enden.