开发者社区> 问答> 正文

关于void*的作用

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

展开
收起
a123456678 2016-06-06 13:39:54 1614 0
1 条回答
写回答
取消 提交回答
  • 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的!

    2019-07-17 19:28:23
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载