如果我将p!= nullptr更改为* p!=' \ 0',那么它有效,但为什么呢?

时间:2017-03-27 10:53:58

标签: c++

我的IDE是Xcode。以下代码无法按预期运行。虽然在较新的C ++标准中推荐使用nullptr。

#include<iostream>
using namespace std;

int count_x(char * p, char x)
{
    if(p==nullptr)return 0;
    int count = 0;
    for (; p!=nullptr; ++p)
        if(*p == x)
            ++count;

    return count;
}

int main()
{
    char str[] = "I'm a little girl in the little world!";

    cout<<"number of t in the string is "<<count_x(str, 't')<<"\n";
}

/*
 the expected output is:

 number of t in the string is 5
 Program ended with exit code: 0

*/

上面的代码可以成功编译,但是当我运行它时,我无法获得预期的输出。在调试模式下,我发现for循环没有停止。所以我将代码更改为以下代码:

#include<iostream>
using namespace std;

int count_x(char * p, char x)
{
    if(p==nullptr)return 0;
    int count = 0;
    for (; *p!='\0'; ++p)
        if(*p == x)
            ++count;

    return count;
}

int main()
{
    char str[] = "I'm a little girl in the little world!";

    cout<<"number of t in the string is "<<count_x(str, 't')<<"\n";
}

/*
 the expected output is:

 number of t in the string is 5
 Program ended with exit code: 0

*/

在我将p!= nullptr更改为* p!=&#39; \ 0&#39;之后,代码工作正常并且获得了预期的输出。虽然代码似乎有效,但我仍然不了解失败或成功的原因。

你能给我一些线索或建议吗?感谢。

3 个答案:

答案 0 :(得分:3)

  

唯一的区别是将nullptr更改为'\ 0'。

还有另一个不同之处:

 p!=nullptr
*p!='\0'
^
|
+---- right here, a dereference operation
  

我仍然不明白失败的原因......

     

我发现for循环没有停止

当p的值为nullptr(即为零)时,您的条件是停止。但是你只会增加p,那么它怎么能达到零呢?在溢出字符串之前,它不会达到零。

  

我仍然不明白......成功的原因。

在成功尝试中,结束条件不是比较指针,而是将指向的值与空终止字符进行比较。只要字符串以空值终止,这就可以工作。

附加说明:尽管空指针和空字符都具有相同的名称(null)和相同的值(0),但它们具有不同的类型并且是单独的概念。

答案 1 :(得分:2)

nullptr的类型为std::nullptr_t。它是可以转换为任何类型的通用指针文字 '\0'的类型为char。它用于 C风格的字符串,用于标记字符串终止 两者在您的平台上可能具有相同的值,但是类型不同。比较例如0公里到0公斤是不好的。

现在代码中的真正问题是p == nullptr。你只能通过递增来指望指针成为nullptr(开始指向什么)。

  
    

唯一的区别是将nullptr更改为'\0'

  

不,您还将p更改为*p

答案 2 :(得分:0)

考虑

int test = NULL;

int *test = NULL;

以上代码都可以正常工作。 (虽然上面的第一行会说“关于从NULL转换为非指针类型”的警告

然而,

nullptr实际上是一个“空指针”,总是一个指针。如果您尝试将其指定为整数。它会导致错误

int test = nullptr;

但如果是

,它会奏效
int *test = nullptr;