首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >void*是什么意思以及如何使用它?

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

Stack Overflow用户
提问于 2012-07-24 16:15:02
回答 10查看 190.7K关注 0票数 176

今天,当我读别人的代码时,我看到了像void *func(void* i);这样的东西,这里的void*对于函数名和变量类型分别意味着什么?

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

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2012-07-24 19:15:36

指向void的指针是“泛型”指针类型。void *可以在不显式强制转换的情况下转换为任何其他指针类型。不能取消对void *的引用,也不能使用它进行指针运算;必须先将它转换为指向完整数据类型的指针。

void *通常用于需要能够在同一代码中使用不同指针类型的地方。一个经常被引用的例子是库函数qsort

代码语言:javascript
复制
void qsort(void *base, size_t nmemb, size_t size, 
           int (*compar)(const void *, const void *));

base是数组的地址,nmemb是数组中元素的数量,size是每个元素的大小,compar是指向比较数组中两个元素的函数的指针。它的名字是这样的:

代码语言:javascript
复制
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);

在函数调用中,数组表达式iArrdArrlArr从数组类型隐式转换为指针类型,并且每个表达式都从“指向iArr的指针”隐式转换为“指向void的指针”。

比较函数将如下所示:

代码语言:javascript
复制
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 *的缺点是,您将类型安全抛在了窗外,并将其抛到了迎面而来的流量中。没有什么可以防止你使用错误的比较例程:

代码语言:javascript
复制
qsort(dArr, sizeof dArr/sizeof dArr[0], sizeof dArr[0], compareInt);

compareInt期望它的参数指向ints,但实际上是使用doubles。没有办法在编译时捕捉到这个问题;你只会得到一个排序错误的数组。

票数 207
EN

Stack Overflow用户

发布于 2012-07-24 16:20:26

使用void *意味着函数可以接受不需要是特定类型的指针。例如,在套接字函数中,您拥有

代码语言:javascript
复制
send(void * pData, int nLength)

这意味着您可以通过多种方式调用它,例如

代码语言:javascript
复制
char * data = "blah";
send(data, strlen(data));

POINT p;
p.x = 1;
p.y = 2;
send(&p, sizeof(POINT));
票数 27
EN

Stack Overflow用户

发布于 2012-07-24 16:23:40

在这一点上,c是值得注意的。可以说void是虚无,void*是一切(can be everything)。

正是这个小小的*让一切变得不同。

雷内指出了这一点。void *是指向某个位置的指针。如何“解释”是留给用户的。

这是在C中拥有不透明类型的唯一方法。非常突出的例子可以在glib或通用数据结构库中找到。它在"C接口和实现“中有非常详细的介绍。

我建议您阅读完整的章节,并尝试理解指针的概念,以“获得它”。

票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11626786

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档