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

关于void*的作用

关于void*的作用

Helenr 2019-04-08 11:18:57
void*指针有什么用?(不是哪些情况用void,而是关于后面的疑问->)int转void*再转回int*,跟int*转float*再转回int*从结果来说不是一样的么?void*作为"中间人"的功能,float*也能做到,用void*仅仅是为了“看起来”合乎逻辑?
查看完整描述

2 回答

?
哈士奇WWW

TA贡献1799条经验 获得超6个赞

void*指针其实可以用作泛型,你想象一下你在C中要交换两个变量,如果是两个整数的话,就像:
voidswap_int(int*lhs,int*rhs)
{
inttmp=*lhs;
*lhs=*rhs;
*rhs=tmp;
}
如果要交换小数,那还要写一个
voidswap_float(float*lhs,float*rhs)
{
;//
}
那么既然都是把两个变量的bitpattern交换一下,那就可以把这种方法抽象出来:
voidswap(void*lsh,void*rhs)
{
;//
}
因为你不知道究竟要交换多少个bit,所以,还需要一个参数来指定要交换的bit的数量:
voidswap(void*lsh,void*rhs,size_tsize)
{
;//
}
有了这样一个函数,那么如果想要交换两个变量,那就可以:
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*的!
                            
查看完整回答
反对 回复 2019-04-08
  • 2 回答
  • 0 关注
  • 622 浏览
慕课专栏
更多

添加回答

举报

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