c++中的void指针

基本含义

void*在The C++ Programming Language中解释为:pointer to an object of unknown type. 即指向一未知类型的对象。

那么我们什么时候会用到或者见到void*指针呢?
在一些底层的代码中,我们可能需要处理一片内存,但是我们并不知道这一块内存存储的到底是什么类型的对象,在之后的例子中将会以memset讲解。

使用规则

  1. void*可以被赋值为任意类型对象的指针(隐式转化),除了指向函数或者成员的指针
  2. void*可以被另一个void*赋值
  3. void*之间可以比较是否相等
  4. void*可以被显式转化为其他类型
  5. 除以上的4点操作之外的其他操作都是不安全的

例1

代码引用自The C++ Programming Language

void f(int *p) {
        void* pi = p;  //implicit conversion from int* to void*   
        *pv;  //error: can't redeference void*        
        ++pv;  //error: can't increment void* (the size of the object pointed to is unknown)

        int* pi2 = static_cast<void*>(pi);  //explicit conversion back to int*

        double* pd1 = pv;  //error
        double* pd2 = pi;  //error: the type of the pointers is not equal
        double* pd3 = static_cast<void*>(pi);  //unsafe
}

例2

memset的原型为:void * memset ( void * ptr, int value, size_t num );
其中第一个参数为void*,因为我们并不知道要memset的到底是一个int数组,还是char型数组之类的,所以我们用void*来代表第一个参数,在C标准库一书中,memset的实现如下:

void* memset(void* ptr, int value, size_t num) {
    const unsigned char uc = value;    //convert int to unsigned char
    unsigned char* p;    //void* will be implicit convert to unsigned char*
    for (p = ptr; num > 0; num--, p++) {
        *p = value;
    }
}

在函数内的第2行,我们声明一个unsigned char*类型的指针p,并在循环内,将其void*隐式转化为unsigned char*型。
但是该代码只能在gcc下编译通过,如果用g++的话,必须要进行显式类型转化,代码如下:

void* memset(void* ptr, int value, size_t num) {
    const unsigned char uc = value;
    unsigned char* p;
    for (p = static_cast<unsigned char*>(ptr); num > 0; num--, p++) {
        *p = value;
    }
}

以及通过上面的代码,我们不难看出为什么对int型数组进行内存初始化:memset(a, 1, sizeof(a))答案不对了= =

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值