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

时间:2015-06-19 18:16:28

标签: 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;
}

符合标准的4.12部分:

  

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

那为什么不呢?

3 个答案:

答案 0 :(得分:11)

你是一个间接的层! “空指针”和“指向null / 0的指针”是两回事。

最基本的:

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

p  == 0;  // yes
*p == 0;  // no

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

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

p  == nullptr; // yes
*p == '\0';    // no

答案 1 :(得分:3)

此代码:

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;
}
如果false中的地址为p,则

仅返回NULL。如果NULL的输入字符串不是strtol [在任何行为良好的程序中NULL都不会发生 - 并保证不是std::string,并且NULLstrtol的输入是未定义的行为,因此没有定义p在这种情况下会发生什么 - 但很可能是你从这种尝试中崩溃了。“

换句话说,转换为bool的前提是不正确的。

你可以把它写成:

 return *p;

如果p指向零(零)字符,则返回true。

答案 2 :(得分:2)

您似乎将“空指针”与“指向NULL的指针”混合在一起(无论后者是什么意思)。您引用的标准文本没有说明任何“NULL指针”。您引用的文字清楚明确地说明空指针已转换为false

您发布的代码没有任何空指针,即它没有任何带有空指针值的指针。代码中的指针p指向str.c_str()缓冲区内的某个有效位置,这意味着p本身不为空。因此,您的代码中没有任何内容可以根据标准的引用段落转换为false