nullptr указывает на пустой указатель, не указывающий ни на какой объект.
Также как и nullptr можно использовать NULL и 0.
#include <iostream> // cout, endl
#include <iomanip> // boolalpha
using namespace std;
int main(){
cout << boolalpha; // Для вывода логических значений в виде true и false, а не 1 и 0
int* p = nullptr; // Присваиваем указателю значение nullptr
cout << (p == nullptr) << endl; //true p - нулевой указатель
cout << (p == NULL) << endl; //true
cout << (p == 0) << endl; //true
int a = 10; // Создали переменную тип int
p = &a; // Присвоили указателю p адрес переменной a
cout << (p == nullptr) << endl; //false p - не нулевой указатель
cout << (p == NULL) << endl; //false
cout << (p == 0) << endl; //false
}
Для указания нулевого указателя рекомендуется использовать именно nullptr являющийся значением указателя и компилятор это понимает, а не NULL являющийся макросом на ноль (обычно) и не 0 являющийся целочисленным значением.
#include <iostream> // cout, endl
using namespace std;
void print_type(int* p){ // Функция принимает указатель
cout << "pointer = " << p << endl; // Выводим что вызвана функция с указателем и его значение
}
void print_type(int p){ // Перегрузка функции print_type() принимающая int
cout << "value = " << p << endl; // Выводим что вызвана функция со значением его значение
}
int main(){
int* p1 = nullptr; // Присваиваем указателю значение nullptr
int* p2 = NULL; // Присваиваем указателю значение NULL
int* p3 = 0; // Присваиваем указателю значение 0
print_type(p1); //pointer = 0
print_type(p2); //pointer = 0
print_type(p3); //pointer = 0
cout << endl; // Выведем разделитель
print_type(nullptr);//pointer = 0
//print_type(NULL); // Выводит ошибку но где-то пишут что вызвалась бы функция со значением (value = 0)
print_type(0); //value = 0 Видим что вызвалась функция со значением,так что 0 != nullptr
}