C++的nullptr与NUL

Posted 流浪孤儿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++的nullptr与NUL相关的知识,希望对你有一定的参考价值。

  1. 指针空值nullptr(C++11)  

  • 1.1C++98中的指针空值

void TestPtr()

{

    int* p1 = NULL;

    int* p2 = 0;

}

在良好的C/C++编程习惯中,声明一个变量时最好给该变量一个合适的初始值,否则可能会出现不可预料的错误,比如未初始化的指针。如果一个指针没有合法的指向,我们基本都是按照如下方式对其进行初始化:

NULL实际是一个宏,在传统的C头文件(stddef.h)中,可以看到如下代码:

#ifndef NULL

#ifdef __cplusplus

#define NULL 0

#else

#define NULL ((void *)0)

#endif

#endif

可以看到,NULL可能被定义为字面常量0,或者被定义为无类型指针(void*)的常量。不论采取何种定义,在使用空值的指针时,都不可避免的会遇到一些麻烦,比如:

#define _CRT_SECURE_NO_WARNINGS 1

#include<iostream>

using namespace std;

void f(int)

{

    cout << "f(int)" << endl;

}

void f(int*)//根据命名规则发现C++可以这样写,但C语言绝对不可以这样写

{

    cout << "f(int*)" << endl;

}

int main()

{

    f(0);//f(int)

    f(NULL);//f(int),预处理成fun(0)

    f((int*)NULL);//f(int*)

    f(nullptr);//f(int*)预处理为fun((void*)0);

    return 0;

}

程序本意是想通过f(NULL)调用指针版本的f(int*)函数,但是由于NULL被定义成0,因此与程序的初衷相悖。

C++98中,字面常量0既可以是一个整形数字,也可以是无类型的指针(void*)常量,但是编译器默认情况下  将其看成是一个整形常量,如果要将其按照指针方式来使用,必须对其进行强转(void *)0

1.2注意

  1. 在使用nullptr表示指针空值时,不需要包含头文件,因为nullptr是C++11作为新关键字引入的。
  2. 在C++11中,sizeof(nullptr) 与 sizeof((void*)0)所占的字节数相同。
  3. 为了提高代码的健壮性,在后续表示指针空值时建议最好使用nullptr。

以上是关于C++的nullptr与NUL的主要内容,如果未能解决你的问题,请参考以下文章

NULL与nullptr

nullptr和NULL

喵呜:C++基础系列:auto关键字(C++11)基于范围的for循环(C++11)指针空值nullptr(C++11)

喵呜:C++基础系列:auto关键字(C++11)基于范围的for循环(C++11)指针空值nullptr(C++11)

喵呜:C++基础系列:auto关键字(C++11)基于范围的for循环(C++11)指针空值nullptr(C++11)

C++ - “!pointer”和“pointer == nullptr”之间的区别?