void* 指针有什么用

void*其实可以理解为一个context,利用它可以很好的实现C语言面向对象编程。我觉得使用void*,不是为了看起来合适,而是一个约定,使用C/C++编程的人员看到void*,习惯性的就会认为——这是个私有数据,只有定义的一方才有权解释;这也是我们在回调函数中传递void*作为userdata的基础共识。

void*指针其实可以用作泛型,你想象一下你在C中要交换两个变量,如果是两个整数的话,就像:

void swap_int(int* lhs, int* rhs)
{
    int tmp = *lhs;
    *lhs = *rhs;
    *rhs = tmp;
}

如果要交换小数,那还要写一个

void swap_float(float* lhs, float* rhs)
{
    ;//
}

那么既然都是把两个变量的bit pattern交换一下,那就可以把这种方法抽象出来:

void swap(void* lsh, void* rhs)
{
    ;//
}

因为你不知道究竟要交换多少个bit,所以,还需要一个参数来指定要交换的bit的数量:

void swap(void* lsh, void* rhs, size_t size)
{
    ;//
}

有了这样一个函数,那么如果想要交换两个变量,那就可以:

swap(&ai, &bi, sizeof(int));
swap(&af, &bf, sizeof(float));

用void* 仅仅是为了“看起来”合乎逻辑

但是,用回上面的例子,如果我用float*代替void*,那的确是可以的,但是我为什么每次调用它都要先做强制类型转换swap((float* )&ai, (float* )&bi, sizeof(int)),你把这样一个接口给另外的一个人使用,他会怎么想?我擦,你交换两个整数,还要先转换为float*,万一给个新手,人家还不敢用,我擦,你这里面有什么奥妙么?

的确,void*和其他指针一样,都是占同样大小的内存空间,唯一和其他指针不同的就在于你不能对void*进行解引用,看起来其他类型的指针都可以用void*来代替,只要在解引用之前把它转换为相应类型的指针就OK了!

那么,如果是这样的话,那用void*的确是为了看起来合乎逻辑。我暂时也想不到有哪些情况是必须要用上void*的!

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

狂奔的乌龟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值