C/C++关于NULL和nullptr的区别

起因

在用C++尾插法构建链表时, 我用NULL来表示空指针, 并用如下代码检查是否到了链表的尾部:

while (oldE->next)

但是在debug时发现这个表达式总是正确的

经过查资料发现:

  • 我们可以在C中用NULL表示空指针
  • 但是在C++中, NULL并不能用来表示空指针, 而应该用nullptr

C中的NULL

在C语言中我们将NULL用作空指针之用,NULL在C语言中的定义如下:

#define NULL    ((void *)0)1

可以看到,C语言中NULL是一个void*指针,我们常用其来对指针变量进行初始化赋值或者作为返回类型为指针的函数的返回值(如函数执行失败时)等等。

C++中的NULL

在C++中,NULL的定义如下:

/* Define NULL pointer value */
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else /* __cplusplus */
#define NULL ((void *)0)
#endif /* __cplusplus */
#endif /* NULL */

可以看到,在C++中,NULL被定义为0,而不是(void*)0,为什么C++在NULL的定义上不继续兼容C延续(void*)0的定义呢?因为C++中不能将void*类型的指针隐式转换成其他指针类型,所以将NULL定义为(void*)0的话并不能起到空指针的作用

nullptr

nullptr关键字用于标识空指针,是std::nullptr_t类型的(constexpr)变量。它可以转换成任何指针类型和bool布尔类型(主要是为了兼容普通指针可以作为条件判断语句的写法),但是不能被转换为整数。