为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C
杨魅力 2019-10-14 14:20:04
今天,当我阅读别人的代码时,我看到类似的含义,分别对函数名称和变量类型意味着void *func(void* i);什么void*?另外,我们什么时候需要使用这种指针以及如何使用它?
查看完整描述

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 一起使用。在编译时没有办法解决这个问题。您将得到一个错误排列的数组。


查看完整回答
反对 回复 2019-10-14
?
Cats萌萌

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));


查看完整回答
反对 回复 2019-10-14
?
红颜莎娜

TA贡献1842条经验 获得超12个赞

就这一点而言,C非常出色。可以说虚无就是虚无虚无*是一切(可以是一切)


只是这个微小的*有所作为。


雷内指出了这一点。无效*是指向某个位置的指针。怎样“解释”什么留给用户。


这是在C中具有不透明类型的唯一方法。可以在glib或常规数据结构库中找到非常突出的示例。在“ C接口和实现”中对其进行了非常详细的介绍。


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


查看完整回答
反对 回复 2019-10-14
  • 3 回答
  • 0 关注
  • 1206 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信