Ответ 1
В C++ 11 и далее указатель, который является ==NULL
, также будет ==nullptr
и наоборот.
Использование NULL
, отличное от сравнения с указателем (например, использование его для представления нулевого байта в конце строки) не будет работать с nullptr
.
В некоторых случаях NULL
- это #define NULL 0
, поскольку целочисленная константа 0
имеет специальный регистр в C и C++ при сравнении с указателями. Эта нетипичная информация о типе вызывает некоторые проблемы как в C, так и в C++, поэтому в C++ они решили создать специальный тип и значение, которые делают то же самое в "правильных" случаях использования и надежно не компилируются в большинство "неправильных" вариантов использования.
Поскольку ваша реализация C++ совместима с реализацией C, с которой вы взаимодействуете (очень редко, если это не так), все должно работать.
Чтобы было очень ясно, если ptr
является любым указателем, то следующие выражения эквивалентны в C++:
ptr == nullptr
ptr == NULL
ptr == 0
!ptr
Как и следующее:
ptr = nullptr
ptr = NULL
ptr = 0
и если X
- это какой-то тип, то таковы и следующие утверждения:
X* ptr = nullptr;
X* ptr = NULL;
X* ptr = 0;
nullptr
отличается, когда вы передаете его в шаблонную функцию, которая выводит тип (NULL
или 0
становятся int
, если не переданы аргументу, ожидающему указатель, в то время как nullptr
остается nullptr_t
) и при использовании в некоторых контекстах, где nullptr
не будет компилироваться (например, char c = NULL;
) (обратите внимание, не char* c=NULL;
)
Наконец, буквально:
NULL == nullptr
верно.
Константа NULL
повышается до типа указателя, а в качестве указателя это нулевой указатель, который затем сравнивается равным nullptr
.