今天,当我读别人的代码时,我看到了像void *func(void* i);这样的东西,这里的void*对于函数名和变量类型分别意味着什么?
此外,我们什么时候需要使用这种指针,以及如何使用它?
发布于 2012-07-24 19:15:36
指向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从数组类型隐式转换为指针类型,并且每个表达式都从“指向iArr的指针”隐式转换为“指向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。没有办法在编译时捕捉到这个问题;你只会得到一个排序错误的数组。
发布于 2012-07-24 16:20:26
使用void *意味着函数可以接受不需要是特定类型的指针。例如,在套接字函数中,您拥有
send(void * pData, int nLength)这意味着您可以通过多种方式调用它,例如
char * data = "blah";
send(data, strlen(data));
POINT p;
p.x = 1;
p.y = 2;
send(&p, sizeof(POINT));发布于 2012-07-24 16:23:40
在这一点上,c是值得注意的。可以说void是虚无,void*是一切(can be everything)。
正是这个小小的*让一切变得不同。
雷内指出了这一点。void *是指向某个位置的指针。如何“解释”是留给用户的。
这是在C中拥有不透明类型的唯一方法。非常突出的例子可以在glib或通用数据结构库中找到。它在"C接口和实现“中有非常详细的介绍。
我建议您阅读完整的章节,并尝试理解指针的概念,以“获得它”。
https://stackoverflow.com/questions/11626786
复制相似问题