C++——nullptr

简介: 介绍C++的指针控制nullptr

指针空值nullptr(C++11)  

1.C++98中的指针空值  

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

voidTestPtr()

{

   int*p1=NULL;

   int*p2=0;

   // ……

}

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

#ifndef NULL

#ifdef __cplusplus

#define NULL 0

#else

#define NULL ((void *)0)

#endif

#endif

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

voidf(int)

{

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

}

voidf(int*)

{

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

}

intmain()

{

   f(0);

   f(NULL);

   f((int*)NULL);

   return0;

}

这里前面两个居然都打印出了第一个。

程序本意是想通过f(NULL)调用指针版本的f(int)函数,但是由于NULL被定义成0,因此与程序的初衷相悖。在C++98中,字面常量0既可以是一个整形数字,也可以是无类型的指针(void)常量,但是编译器默认情况下将其看成是一个整形常量,如果要将其按照指针方式来使用,必须对其进行强转(void *)0。注意:

在使用nullptr表示指针空值时,不需要包含头文件,因为nullptr是++11作为新关键字引入的。

在C++11中,sizeof(nullptr) 与 sizeof((void*)0)所占的字节数相同。

为了提高代码的健壮性,在后续表示指针空值时建议最好使用nullptr。

voidf(int)

{

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

}

voidf(int*)

{

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

}

intmain()

{

   f(0);

   f(NULL);

   f(nullptr);

   return0;

}



相关文章
|
6月前
|
安全 编译器 程序员
C++入门篇---(完)内联函数,auto,for,nullptr
C++入门篇---(完)内联函数,auto,for,nullptr
37 1
|
4月前
|
存储 安全 编译器
【C++11特性篇】盘点C++11中三种简化声明的方式【auto】【decltype】【nullptr】(3)
【C++11特性篇】盘点C++11中三种简化声明的方式【auto】【decltype】【nullptr】(3)
|
6月前
|
程序员 编译器 C语言
【C++】初识C++2(内联函数&auto关键字&范围for循环&nullptr)(下)
【C++】初识C++2(内联函数&auto关键字&范围for循环&nullptr)(下)
|
6月前
|
存储 编译器 C语言
【C++】初识C++2(内联函数&auto关键字&范围for循环&nullptr)(上)
【C++】初识C++2(内联函数&auto关键字&范围for循环&nullptr)(上)
|
7月前
|
编译器 C语言 C++
再谈NULL和nullptr(C++11)区别
在谈NULL和nullptr区别之前,我们先看段代码:
|
4月前
|
存储 安全 编译器
【C++】内联函数、auto关键字、基于范围的for循环、指针空值nullptr
【C++】内联函数、auto关键字、基于范围的for循环、指针空值nullptr
38 0
|
1月前
|
安全 算法 程序员
【C++ 空指针的判断】深入理解 C++11 中的 nullptr 和 nullptr_t
【C++ 空指针的判断】深入理解 C++11 中的 nullptr 和 nullptr_t
49 0
|
1月前
|
安全 算法 程序员
【C++智能指针 空指针判断】深入探索C++智能指针:nullptr与empty的微妙差异
【C++智能指针 空指针判断】深入探索C++智能指针:nullptr与empty的微妙差异
31 1
|
2月前
|
程序员 编译器 C++
【C++11】 指针空类型 - nullptr
【C++11】 指针空类型 - nullptr
19 0
|
3月前
|
编译器 C语言 C++
C++特性——auto关键字、范围for、指针空值nullptr
C++特性——auto关键字、范围for、指针空值nullptr