人生就像一杯茶,不会苦一辈子,但总会苦一阵子
很多小伙伴在各种开发场景中经常使用到void*, NULL和nullptr, 但是它们之间的区别确经常被忽视, 今天我就来带着大家看看,它们之间到底有什么样的区别
在C语言中, 一般会这么实现:
#define NULL ((void*)0)
NULL是一个标标准准的宏定义,用来表示不指向任何内存,从以上可以看出,NULL在底层是调用了0, 在C语言中,NULL和0是一样的,但是为了在开发中容易识别,就一般使用NULL当作空指针,0用于数值
在C++中,一般会
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void*)0)
#endif
#endif
在C++11的新标准中,nullptr来代替(void*)0, NULL只用来代表0,可见,在C++中为了开发方便,进行了更加明确的区分。
总结
void* 代表的任意类型的指针,但是不一定为空
NULL其实就是0值,但是为了语义上区分,用它来代表指针
nullptr是C++11引入的新标准,使用nullptr来指向空指针,NULL专门用来表示数值0(注意,C语言可没有这么说)
PS:
在C语言标准中,明确的进行了规范 :
值为0 的整型常量表达式,或强制(转换)为“void*”类型的此类表达式,称为空指针常量。 当将一个空指针常量赋予一个指针或与指针作比较时,将把该常量转换为指向该类型的指针,这样的指针称为空指针。 空指针在与指向任何对象或函数的指针作比较时保证不会相等