void *是什么意思,以及如何使用它?

今天,当我阅读别人的代码时,我看到类似的含义,分别对函数名称和变量类型意味着void *func(void* i);什么void*

另外,我们什么时候需要使用这种指针以及如何使用它?


杨魅力
浏览 1207回答 3
3回答

撒科打诨

指向的指针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 一起使用。在编译时没有办法解决这个问题。您将得到一个错误排列的数组。

Cats萌萌

使用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));

红颜莎娜

就这一点而言,C非常出色。可以说虚无就是虚无虚无*是一切(可以是一切)只是这个微小的*有所作为。雷内指出了这一点。无效*是指向某个位置的指针。怎样“解释”什么留给用户。这是在C中具有不透明类型的唯一方法。可以在glib或常规数据结构库中找到非常突出的示例。在“ C接口和实现”中对其进行了非常详细的介绍。我建议您阅读完整的章节并尝试理解“获取它”的指针的概念。
打开App,查看更多内容
随时随地看视频慕课网APP