1. nullptr的使用
C++11 引入了 nullptr 关键字,它是一种空指针常量,用于表示空指针。nullptr 具有明确的类型,可以被赋值给任意指针类型,而不会引发类型转换的歧义。使用 nullptr 可以提高代码的清晰度,避免了与整数零的混淆。
以下是 nullptr 的用法示例:
int* ptr1 = nullptr; // 使用 nullptr 初始化指针,表示空指针
double* ptr2 = nullptr; // 可以用于不同类型的指针
if (ptr1 == nullptr) {
// 检查指针是否为空
// ...
}
void myFunction(int* ptr) {
if (ptr == nullptr) {
// 函数参数为 nullptr 时的处理
// ...
}
}
这里不写具体的例子了,nullptr还是挺常用的。
主要介绍下跟NULL的区别
2. NULL和nullptr的区别
一段代码就能看懂:
#include <iostream>
void foo(int* ptr) {
std::cout << "foo(int* ptr) is called." << std::endl;
}
void foo(int i) {
std::cout << "foo(int i) is called." << std::endl;
}
int main() {
foo(0); // 调用 foo(int i)
foo(NULL); // 调用 foo(int i)
foo(nullptr); // 调用foo(int* i)
return 0;
}
foo(0) 和 foo(nullptr)都很明显一个调用int,一个调用int*
foo(NULL) 在c++中被视为0,所以我们本意想调用int*,但最后调用的是int
解释:
底层源码中NULL是这样定义的:
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif
就是说c++中NULL就是0,
也就是说如果源码是C++程序NULL就是0,如果是C程序NULL表示(void*)0。那么为什么要这样做呢? 是由于 C++ 中,void * 类型无法隐式转换为其他类型的指针,此时使用 0 代替 ((void *)0),用于解决空指针的问题。这个0(0x0000 0000)表示的就是虚拟地址空间中的0地址,这块地址是只读的。