1

也许这是愚蠢或明显的,但我无法谷歌任何答案。什么字符以空结尾的字符串结尾C++11NULL(实际上是0)还是新的nullptr?一方面,nullptr应该替换NULL. 但另一方面,我不确定是否nullptr是一个角色。或者可以解释为一。

4

2 回答 2

7

NULL并且nullptr与以空结尾的字符串关系不大。两者NULLnullptr都用于表示一个指向任何内容的指针,即。

c 风格字符串的空终止仍然(并且一直)由CharT具有整数值的 a 表示0;或者就像在谈话时最常写的那样,通过char-literal ; '\0'.

请记住,字符类型只不过是具有某些特殊含义的整数类型。

char允许将 a与a int(这是 literal 的类型0)进行比较,也允许将值分配0给 a char,如前所述:字符类型是整数类型.. 并且整数类型保存整数值。


为什么会出现这种混乱?

回到我们没有 的日子nullptr,相反,我们有宏NULL来表示某个指针没有任何指向的东西。的值NULL特定于实现的,但行为是明确定义的;它不应与实际指向某物的任何指针值进行比较

由于如何NULL描述 的行为,许多编译器使用了#define NULL 0或类似的构造,从而产生了一个“特征”,可以轻松地与NULL任何整数类型(包括char)进行比较,以查看它是否与值零相关。


考虑到前面所述,您经常偶然发现如下代码,其中for-condition等同于具有*ptr != 0.

char const * str = "hello world";

for (char const * ptr = str; *ptr != NULL; ++ptr) {
  ...    
}

经验教训仅仅因为某些东西有效并不意味着它是正确的......

于 2014-03-16T23:25:22.940 回答
1

NULL并且nullptr是与“空终止符”完全不同的概念。它们的共同点就是“null”这个词。空终止符是具有 value 的字符0。它与空指针无关。

您可以使用0'\0'等。

于 2014-03-16T23:25:12.200 回答