void*意味着什么以及如何使用它?

One*_*ero 134 c

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

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

Joh*_*ode 165

指向的void是"通用"指针类型.A void *可以转换为任何其他指针类型而无需显式转换.你不能取消引用void *或用它做指针算术; 您必须首先将其转换为指向完整数据类型的指针.

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

void qsort(void *base, size_t nmemb, size_t size, 
           int (*compar)(const void *, const void *));
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)

数组表达式iArr,dArrlArr,在函数调用中从数组类型隐式转换为指针类型,并且每个都隐式地从"指针转换为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;
}
Run Code Online (Sandbox Code Playgroud)

通过接受void *,qsort可以使用任何类型的数组.

使用的缺点void *是你将窗户的类型安全性抛到了迎面而来的交通中.没有什么可以保护您免于使用错误的比较例程:

qsort(dArr, sizeof dArr/sizeof dArr[0], sizeof dArr[0], compareInt);
Run Code Online (Sandbox Code Playgroud)

compareInt期待它的论点指向ints,但实际上是在使用doubles.在编译时没有办法解决这个问题; 你只需要一个错误的阵列.

  • 实际上并不能保证`void*`可以强制转换为函数指针.但对于数据指针你所说的话. (5认同)

The*_*eve 22

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

send(void * pData, int nLength)
Run Code Online (Sandbox Code Playgroud)

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

char * data = "blah";
send(data, strlen(data));

POINT p;
p.x = 1;
p.y = 2;
send(&p, sizeof(POINT));
Run Code Online (Sandbox Code Playgroud)

  • 我想它会是类似的,但是由于没有类型检查,犯错可能会导致非常奇怪的结果或导致程序彻底崩溃. (3认同)

Ren*_*řík 8

void*
Run Code Online (Sandbox Code Playgroud)

是一个“指向内存的指针,不假设存储的是什么类型”。例如,您可以使用,如果您想将参数传递给函数,并且该参数可以是多种类型,并且在函数中您将处理每种类型。


Fri*_*ich 7

在这方面,C是显着的.可以说虚空是虚无无效*就是一切(可以是每个人)

正是这个微小的*才有所作为.

雷内指出了这一点.void*是指向某个位置的指针.有什么"解释"是留给用户的.

这是在C中使用不透明类型的唯一方法.例如在glib或通用数据结构库中可以找到非常突出的示例.它在"C接口和实现"中得到了非常详细的处理.

我建议你阅读完整的章节并尝试理解指向"获取它"的概念.