习惯了微笑 發表於 2026-3-16 15:11:00

指针空置类型-nullptr

<p>先看一段代码:</p>
<pre><code class="language-c++">#include &lt;iostream&gt;
using namespace std;

void func(char* p) {
        cout &lt;&lt; "void func(char* p)" &lt;&lt; endl;
        cout &lt;&lt; p &lt;&lt; endl;
}

void func(int p) {
        cout &lt;&lt; "void func(int p)" &lt;&lt; endl;;
        cout &lt;&lt; p &lt;&lt; endl;
}

int main() {
        //int
        func(10);
        //char*
        func(NULL);   //这里我希望程序调用func(char* p)的函数

        system("pause");
        return 0;
}
</code></pre>
<p>输出结果:</p>
<pre><code class="language-c++">void func(int p)
10
void func(int p)
0
</code></pre>
<p>调用了两次func(int p)函数,且按理说NULL指针是不能cout的</p>
<p>也就是说第二次调用func(NULL)也调用了一次func(int p) 并且传入的p是0</p>
<p><strong>原因:</strong></p>
<p>在底层源码中NULL这个宏是这样定义的</p>
<pre><code class="language-c++">#ifndef NULL
    #ifdef __cplusplus
      #define NULL 0
    #else
      #define NULL ((void *)0)
    #endif
#endif
</code></pre>
<p>也就是说如果源码是C++程序NULL就是0,如果是C程序NULL表示(void*)0。那么为什么要这样做呢? <strong>是由于 C++ 中,void * 类型无法隐式转换为其他类型的指针,此时使用 0 代替 ((void *)0),用于解决空指针的问题。</strong>这个0(0x0000 0000)表示的就是虚拟地址空间中的0地址,这块地址是只读的。</p>
<p>正如:C++98/03 标准中,将一个指针初始化为空指针的方式有 2 种</p>
<pre><code class="language-c++">char *ptr = 0;
char *ptr = NULL;
</code></pre>
<p>并且</p>
<pre><code class="language-c++">        int* ptr1 = NULL;
        char* ptr2 = NULL;
        double* ptr3 = NULL;
        void* ptr4 = NULL;

        int* ptr5 = ptr4;//报错:"void*"类型的值不能用于初始化"int*"类型的实体
        //是由于 C++ 中,void * 类型无法隐式转换为其他类型的指针,此时使用 0 代替 ((void *)0),用于解决空指针的问题。
        int* ptr5 = (int*)ptr4; //强转正确不报错
</code></pre>
<p>C++11引入nullptr关键字用于标识空指针,是std::nullptr_t类型的(constexpr)变量。它可以转换成任何指针类型和bool布尔类型(主要是为了兼容普通指针可以作为条件判断语句的写法),但是不能被转换为整数。</p>
<p>nullptr是专用于初始化空类型指针,不同类型的指针变量都可以使用 nullptr 来初始化,<strong>nullptr 出现的目的是为了替代 NULL</strong></p>
<pre><code class="language-C++">#include &lt;iostream&gt;
using namespace std;

void func(char* p) {
        cout &lt;&lt; "void func(char* p)" &lt;&lt; endl;
        //cout &lt;&lt; *p &lt;&lt; endl;
}

void func(int p) {
        cout &lt;&lt; "void func(int p)" &lt;&lt; endl;;
        //cout &lt;&lt; p &lt;&lt; endl;
}

int main() {

        int* ptr1 = nullptr;
        char* ptr2 = nullptr;
        double* ptr3 = nullptr;
        void* ptr4 = nullptr;

        int* ptr5 = (int*)ptr4;

        //int
        func(10);
        //char*
        func(nullptr);

        system("pause");
        return 0;
}
</code></pre>
<p>输出结果:</p>
<pre><code class="language-c++">void func(int p)
void func(char* p)
</code></pre>
<p>通过输出的结果可以看出,nullptr 无法隐式转换为整形,但是可以隐式匹配指针类型。在 C++11 标准下,相比 NULL 和 0,使用 nullptr 初始化空指针可以令我们编写的程序更加健壮,因此当需要使用 NULL 时候,养成直接使用 nullptr的习惯。</p><br><br>
来源:https://www.cnblogs.com/ggkx/p/19724972
頁: [1]
查看完整版本: 指针空置类型-nullptr