撒科打诨
指向的指针void是“通用”指针类型。void *可以将A 转换为任何其他指针类型,而无需显式强制转换。您不能取消引用a 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期望其参数指向ints,但实际上与doubles 一起使用。在编译时没有办法解决这个问题。您将得到一个错误排列的数组。