为什么指向NULL-charater的指针未转换为false

St.*_*rio 1 c++ pointers

我以为指针指向NULL可以转换为0.所以我写了以下程序:

#include <iostream>
#include <regex>
#include <string>
#include <cstdlib>

bool is_strtoi(const std::string& str)
{
    char *p;
    std::strtol(str.c_str(), &p, 10);
    return *p == '\0';
}

bool is_strtoi1(const std::string& str)
{
    char *p;
    std::strtol(str.c_str(), &p, 10);
    return p; //Pointer to NULL should be converted to false;
}

int main ()
{
    std::string test1("123asd2");
    std::string test2("123123");
    std::cout << is_strtoi1(test1) << std::endl;
    std::cout << is_strtoi1(test2) << std::endl;
    std::cout << "---" << std::endl;
    std::cout << is_strtoi(test1) << std::endl; //prints 1
    std::cout << is_strtoi(test2) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

根据标准的4.12部分:

零值,空指针值或空成员指针值将转换为false

那为什么不呢?

Lig*_*ica 11

你是一个间接的层!"空指针"和"指向空/零的指针"是两个不同的东西.

最基本的:

  • 空指针本身的值为零.
  • 它没有指向零值的其他对象.

p  == 0;  // yes
*p == 0;  // no
Run Code Online (Sandbox Code Playgroud)

实际上,char*指向长度为0(即{'\0'})的C字符串不是空指针; 它是一个完全有效的指针.

然而,更进一步,指针可以"具有零值"的概念实际上是一个实现细节.在抽象术语中,指针不是数字,因此我们不会将空指针视为具有诸如零的数值.这在引入nullptr无法隐式转换为整数的关键字时很明显.通过删除关于"零"的整个讨论,我们可以提供以下改进的,更合适的示例:

p  == nullptr; // yes
*p == '\0';    // no
Run Code Online (Sandbox Code Playgroud)

  • "空指针本身的值为零"=可能是真的,但你不应该再相信了.p!= nullptr更安全 (2认同)