3 回答
TA贡献1934条经验 获得超2个赞
指向的指针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 一起使用。在编译时没有办法解决这个问题。您将得到一个错误排列的数组。
TA贡献1805条经验 获得超9个赞
使用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));
TA贡献1842条经验 获得超12个赞
就这一点而言,C非常出色。可以说虚无就是虚无虚无*是一切(可以是一切)
只是这个微小的*有所作为。
雷内指出了这一点。无效*是指向某个位置的指针。怎样“解释”什么留给用户。
这是在C中具有不透明类型的唯一方法。可以在glib或常规数据结构库中找到非常突出的示例。在“ C接口和实现”中对其进行了非常详细的介绍。
我建议您阅读完整的章节并尝试理解“获取它”的指针的概念。
- 3 回答
- 0 关注
- 1206 浏览
添加回答
举报