目录
一.简介
1.基本概念
nullptr
是一个类型安全的空指针常量,它的类型是 std::nullptr_t
。可以将 nullptr
赋值给任何指针类型(包括普通指针、成员指针等),也可以将其与指针进行比较。
2.语法
int* ptr = nullptr;//这里的int可以是其它数据类型。
将 ptr
初始化为 nullptr。
二.使用示例
示例1:初始化指针
#include <iostream>
int main() {
// 初始化一个整型指针为 nullptr
int* ptr = nullptr;
if (ptr == nullptr) {
std::cout << "ptr is a null pointer." << std::endl;
}
return 0;
}
在这个示例中,将 ptr
初始化为 nullptr
,表示它不指向任何有效的内存地址。
示例2:作为函数参数
#include <iostream>
void func(int* ptr) {
if (ptr == nullptr) {
std::cout << "Received a null pointer." << std::endl;
} else {
std::cout << "Received a valid pointer." << std::endl;
}
}
int main() {
int num = 10;
int* validPtr = #
int* nullPtr = nullptr;
func(validPtr);
func(nullPtr);
return 0;
}
在这个示例中,func
函数接受一个整型指针作为参数,可以将 nullptr
传递给该函数。
三.nullptr与NULL的区别
1.类型安全
NULL
本质上是一个整数(通常是 0
),在某些情况下可能会导致类型不匹配的问题。而 nullptr
有自己的类型 std::nullptr_t
,可以更好地进行类型检查,避免一些潜在的错误。
2.函数重载问题
当存在函数重载时,NULL
可能会导致歧义。例如:
#include <iostream>
void func(int n) {
std::cout << "Called func(int): " << n << std::endl;
}
void func(int* ptr) {
if (ptr == nullptr) {
std::cout << "Called func(int*): null pointer" << std::endl;
} else {
std::cout << "Called func(int*): valid pointer" << std::endl;
}
}
int main() {
// 使用 NULL 会调用 func(int),可能不是预期的结果
func(NULL);
// 使用 nullptr 会调用 func(int*)
func(nullptr);
return 0;
}
在这个示例中,使用 NULL
调用 func
函数时,由于NULL
本质上是0,
会调用func(int)
;而使用nullptr
会调用 func(int*)
,符合预期。
3.注意事项
(1)兼容性:如果需要兼容旧的 C++ 代码,可能仍然需要使用 NULL
。但在新的 C++11 及以后的代码中,建议优先使用 nullptr
来表示空指针。
(2)不能隐式转换为整数:nullptr
不能隐式转换为整数类型,而 NULL
可以。例如,不能将 nullptr
直接赋值给一个整型变量。
nullptr
是一个更安全、更清晰的表示空指针的方式,在 C++11 及以后的代码中应该优先使用。