美文网首页
void* & NULL & nullptr

void* & NULL & nullptr

作者: hehehehe | 来源:发表于2023-04-09 16:44 被阅读0次

    一、C程序中的NULL

    在C语言中,NULL通常被定义为:

    #define NULL ((void *)0)
    

    二、C++程序中的NULL

    void*是不能隐式转换

    #ifdef __cplusplus
    #define NULL 0
    #else
    #define NULL ((void *)0)
    #endif
    

    NULL在C++中就是0,这是因为在C++中void* 类型是不允许隐式转换成其他类型的,所以之前C++中用0来代表空指针,但是在重载整形的情况下,会出现上述的问题。所以,C++11加入了nullptr,可以保证在任何情况下都代表空指针,而不会出现上述的情况,因此,建议以后还是都用nullptr替代NULL吧,而NULL就当做0使用。

    • void*可以指向任何类型的地址,但是带类型的指针不能指向void*的地址
    float f = 5.5;
    float* pf = &f;
    void* pv = pf;
    float* pf2 = pv;//编译错误,有类型的指针变量不能指向void*变量
    
    • void*指针只有强制类型转换以后才可以正常取值
    int main(int argc, const char * argv[]) {
        
        float f = 5.5;
        float* pf = &f;
        void* pv;
        
        pv = pf; //这句是可以的
        
        cout<<*pv<<endl;  //编译错误,这样直接对pv取值是错误的
        cout<<*(float*)pv<<endl;  //强制类型转换后可以取值
        
        return 0;
    }
    
    image.png

    应用

    void * memcpy(void *dest, const void *src, size_t len);
    void * memset ( void * buffer, int c, size_t num );
    
    int *a=NULL;
    a=(int *)malloc(sizeof(int));//返回的是void*,所以赋值给其他指针类型要强转一下
    

    同样的,malloc函数只关注你要多大的内存,你需要把它怎么划分是你的事情,但是你需要显式的表明你是怎么划分的。这里语法要求是必须的,void *类型转为其他类型必须强制类型转换

    相关文章

      网友评论

          本文标题:void* & NULL & nullptr

          本文链接:https://www.haomeiwen.com/subject/fmbbddtx.html