今天当我阅读别人的代码时,我看到了类似的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,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;
}
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.在编译时没有办法解决这个问题; 你只需要一个错误的阵列.
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)
void*
Run Code Online (Sandbox Code Playgroud)
是一个“指向内存的指针,不假设存储的是什么类型”。例如,您可以使用,如果您想将参数传递给函数,并且该参数可以是多种类型,并且在函数中您将处理每种类型。
在这方面,C是显着的.可以说虚空是虚无无效*就是一切(可以是每个人)
正是这个微小的*才有所作为.
雷内指出了这一点.void*是指向某个位置的指针.有什么"解释"是留给用户的.
这是在C中使用不透明类型的唯一方法.例如在glib或通用数据结构库中可以找到非常突出的示例.它在"C接口和实现"中得到了非常详细的处理.
我建议你阅读完整的章节并尝试理解指向"获取它"的概念.
| 归档时间: |
|
| 查看次数: |
149522 次 |
| 最近记录: |