今天在阅读别人的代码时,我看到了类似的东西void *func(void* i);,void*这里的函数名和变量类型分别是什么意思?
void *func(void* i);
void*
另外,我们什么时候需要使用这种指针以及如何使用呢?
指向的指针void是“通用”指针类型。Avoid *可以在没有显式转换的情况下转换为任何其他指针类型。您不能取消引用 avoid *或对其进行指针运算;您必须首先将其转换为指向完整数据类型的指针。
void
void *
void *通常用于需要能够在同一代码中使用不同指针类型的地方。一个经常被引用的例子是库函数qsort:
qsort
void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *));
base是数组的地址,是数组nmemb中元素的数量,size是每个元素的大小,compar是指向比较数组中两个元素的函数的指针。它被这样调用:
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”。
iArr
dArr
lArr
int
double
long
比较函数看起来像:
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。没有办法在编译时发现这个问题;你只会得到一个错误的数组。
compareInt