suchen

Heim  >  Fragen und Antworten  >  Hauptteil

c++ - 关于void*的作用

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

PHPzPHPz2803 Tage vor1091

Antworte allen(5)Ich werde antworten

  • 黄舟

    黄舟2017-04-17 11:20:49

    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*的!

    Antwort
    0
  • 迷茫

    迷茫2017-04-17 11:20:49

    void * 主要用于抽象数据结构,其具体用途有以下几项(不局限于):

    1. 作为 variant, 比如 setsockopt
    2. 隐藏具体实现(ADT):http://en.wikipedia.org/wiki/Abstract_data_type#Example:_implementation_of_the_stack_ADT
    3. 作为回调接口的 userdata/opaque,该 userdata/opaque 作为一个参数,传给回调处理函数,你可以把这个看成一个Context。

    Antwort
    0
  • 阿神

    阿神2017-04-17 11:20:49

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

    Antwort
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-17 11:20:49

    1.不同类型的指针的sizeof是一样的,分配内存时,还不知道这块内存放的是int还是float时,可以让void*指向这块内存,用的时候在强转。
    2.int * 作为参数传递到函数内部,函数内部暂时没有使用,编译的时候会警告,这时,你可以转一下就不警告了。
    3.不同类型的指针+1所跳过的字节数是不一样的。

    Antwort
    0
  • 迷茫

    迷茫2017-04-17 11:20:49

    已经有正确答案了,建议看一下stanford cs 107b,在这方面讲的很细。

    另外所谓"modern language"像c++,java一般都会在语言本身就帮你提供generic的机制,type cast在大多数情况下都认为是不好的。

    Antwort
    0
  • StornierenAntwort