也许这是愚蠢或明显的,但我无法谷歌任何答案。什么字符以空结尾的字符串结尾C++11
?NULL
(实际上是0
)还是新的nullptr
?一方面,nullptr
应该替换NULL
. 但另一方面,我不确定是否nullptr
是一个角色。或者可以解释为一。
2 回答
NULL
并且nullptr
与以空结尾的字符串关系不大。两者NULL
和nullptr
都用于表示一个指向任何内容的指针,即。空。
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) {
...
}
经验教训:仅仅因为某些东西有效并不意味着它是正确的......
NULL
并且nullptr
是与“空终止符”完全不同的概念。它们的共同点就是“null”这个词。空终止符是具有 value 的字符0
。它与空指针无关。
您可以使用0
或'\0'
等。