nullptr

空值指针(Null Pointer)
在 C++ 中,空值指针(或称为空指针)是一个指向无效或不存在地址的指针。它通常用于指示一个指针目前不指向任何有效对象或内存位置。

1.空值指针的定义

空指针的值通常为 nullptr 或 NULL,其中:

nullptr 是 C++11 引入的关键字,用于表示空指针,具有类型安全性。它的类型是 std::nullptr_t
NULL 是早期 C 语言中用于表示空指针的宏定义,通常定义为 ((void*)0)

2. 空指针的使用场景

空指针通常用于以下几种情况:

1.初始化指针:当一个指针尚未指向任何有效对象时,通常将其初始化为 nullptr,以防止它指向垃圾值或未知地址。
2.指示错误或特殊状态:空指针可以用来表示某个函数无法返回有效的指针或找不到目标对象的情况。
3.作为函数的返回值:当一个函数不能成功返回有效的指针时,可以返回空指针作为一种错误标志。

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

#ifndef NULL 
	#ifdef __cplusplus 
		#define NULL 0 
	#else 
		#define NULL ((void *)0) 
	#endif 
#endif 

代码解释:cpp中NULL是0,C语言中定义为((void*)0)
• C++中NULL可能被定义为字⾯常量0,或者C中被定义为⽆类型指针(void*)的常量。不论采取何种定义,在使⽤空值的指针时,都不可避免的会遇到⼀些⿇烦

void f(int x) 
{ 
    cout << "f(int x)" << endl; 
} 
void f(int* ptr) 
{ 
    cout << "f(int* ptr)" << endl; 
} 
int main() 
{ 
    f(0); 
    // 本想通过f(NULL)调⽤指针版本的f(int*)函数,但是由于NULL被定义成0,调⽤了f(int  x),因此与程序的初衷相悖。  
    f(NULL); 
    f((int*)NULL); 
    // 编译报错:error C2665: “f”: 2 个重载中没有⼀个可以转换所有参数类型  
    // f((void*)NULL);  
    f(nullptr); 
    return 0; 
}

本想通过f(NULL)调⽤指针版本的 f(int* x)函数,但是由于NULL被定义成0,调⽤了f(int x),因此与程序的初衷相悖。f((void *)NULL); 调⽤会报错。

• C++11中引⼊nullptr,nullptr是⼀个特殊的关键字,nullptr是⼀种特殊类型的字⾯量,它可以转换成任意其他类型的指针类型。使⽤nullptr定义空指针可以避免类型转换的问题,因为nullptr只能被隐式地转换为指针类型,⽽不能被转换为整数类型。
所以建议以后使用nullptr

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐