指向void 的指针

    技术2022-05-11  74

    一个指向任何对象 类型的指针都可以赋值给类型为void* 的变量,void* 可以赋值给另一个void* ,两个void* 可以比较相等与否,而且可以显式地将void* 转换到另一个类型。其它操作都是不安全的,因为编译器并不知道实际被指的是哪种对象。因此,对void* 做其他任何操作都将引起编译错误。要使用void*,就必须显式地将经转换到某个指向特定类型的指针。

    例:

    void  Test(int *pi)

    {

      void *pv = pi;  //ok ,从 int* 到 void* 的隐式转换

      *pv ;                   //错误:void* 不能间接引用

       pv++;               //错误:void* 不能增量(不知道被指定类型的大小)

      int *pi1 = static_cast<int*>(pv);    //ok: 显式转换回 int*

      double * pi2 = pv;   //错误

      double *pi3 = pi;    //错误

      double *pi4 = static_cast<double*>(pv);   //ok:  不安全

    }

    1.一般来说,如果一个指针被转换(“强制”,cast)到与被批对象的实际类型不同的指针,使用后一个指针就是不安全的。 void* 的最重要用途是需要向函数货传递一个指针,而又不能对对象的类型做任凭假设。还有就是从函数返回一个无类型的对象。要使用这样的对象。必须通过显式的类型转换。

    2,到函数的指针与到成员的指针都不能赋给void*


    最新回复(0)