6-2 C++ 中的空指针
本节编程练习不计算学习进度,请电脑登录imooc.com操作

C++ 中的空指针

我们之前的课程中曾经讲过空指针的问题,知道在 C++ 中,有使用 NULL 和 nullptr 两种方式表示空指针的方法。

int * p = NULL;
int * p = nullptr;

这一小节来看看两者的区别。

NULL

首先看 NULL,在 C++ 中,NULL 其实就是 0。

例如:

int * p = NULL;

等价于:

int * p = 0;

因为在 C++ 中,0 地址通常是被保护起来的,不可访问的。因此用 0 地址来指代这个指针哪里都不指,是可以的。但是这里面却存在一些问题。因为 NULL 就是 0,所以我们可以把 NULL 用在其他地方。

例如:

int a = NULL;

我们可以将一个 int 变量赋值成 NULL,你永远无法阻止有人这么干。而在某些情况下,甚至会在不经意间酿成惨剧。

例如:

class A
{
public:
    void func(void * t)
    {
    }

    void func(int i)
    {
    }

}

这个类中,func 函数有两个重载。这个时候,我们尝试用 NULL 调用一下:

int main(int argc,char **argv)
{
    A a;
    a.func(NULL);

    return 0;
}

猜猜这个函数到底调用的哪个重载?

nullptr

正是由于 NULL 会导致这样的混乱,所以在 C++11 标准之后,C++ 标准委员会为 C++ 添加了 nullptr 关键字。我们可以将 NULL 赋值给一个普通变量,而 nullptr 却不能。

int a = nullptr;

这样是会直接报错的。

nullptr 只能赋值给指针,所以不会有 NULL 那样的问题。

所以,只要你的编译器兼容 C++11 标准,那么你应该使用 nullptr。

任务

  1.  
下一节