美文网首页
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 *类型转为其他类型必须强制类型转换

相关文章

  • C++11新特新学习

    1.nullptr 用于替换NULL,旧版本NULL和0等价; 原因:旧版本函数重载 void fun(int)和...

  • FFmpeg视频播放

    首先记录一下C++中的NULL、0、nullptr的区别 NULL在C++中就是0,这是因为在C++中void* ...

  • C++11新特性(2)

    1.空指针nullptr nullptr与NULL的区别:对于NULL,是一个空指针常量,如果将NULL扩展为常数...

  • nullptr

    nullptr 空指针:从 0 到 NULL,再到 nullptr NULL 是一个宏定义: 引起该问题的原因是 ...

  • C++11/14新特性

    1.nullptr nullptr 出现的目的是为了替代 NULL,传统 C++ 会把 NULL、0 视为同一种东...

  • C++学习笔记之NULL vs nullptr

    C++学习笔记之NULL vs nullptr

  • NULL,nullptr,null,nil,Nil,NSNull

    NULL:一般指的是C语言里指向基本数据类型以及C类型的空指针,表示空指针((void*)0)或是0,C++里NU...

  • NULL 和nullptr区别

    今天在写一个程序的时候,想设置默认参数。其实自己想的和这个似乎一点关系都没有。 不过不重要。重点是了解了一些东西。...

  • nullptr(转)

    引入nullptr的原因引入nullptr的原因,这个要从NULL说起。对于C和C++程序员来说,一定不会对NUL...

  • 2019-01-08

    c++11中nullptr(与NULL的区别)[https://blog.csdn.net/justdoithai...

网友评论

      本文标题:void* & NULL & nullptr

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