小编典典

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

all

今天在阅读别人的代码时,我看到了类似的东西void *func(void* i);void*这里的函数名和变量类型分别是什么意思?

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


阅读 245

收藏
2022-08-01

共1个答案

小编典典

指向的指针void是“通用”指针类型。Avoid *可以在没有显式转换的情况下转换为任何其他指针类型。您不能取消引用 avoid *或对其进行指针运算;您必须首先将其转换为指向完整数据类型的指针。

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。没有办法在编译时发现这个问题;你只会得到一个错误的数组。

2022-08-01