为什么指向 NULL 字符的指针没有转换为 false

Why is a pointer to NULL-charater not converted to false

本文关键字:转换 false 指针 NULL 字符 为什么      更新时间:2023-10-16

我认为指向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 == '';
}
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部分:

零值、空指针值

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

那么为什么没有呢?

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

最基本的:

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

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

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

不过,更进一步,指针可以"值为零"的概念实际上是一个实现细节。抽象地说,指针不是数字,因此我们不会将空指针视为具有诸如零之类的数值。这在引入不能隐式转换为整数的 nullptr 关键字中很明显。通过删除关于"零"的整个讨论,我们可以给出以下改进的、更合适的例子:

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

此代码:

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;
}

仅当p中的地址NULL时,才会返回false。如果要strtol的输入字符串不是NULL,则保证不会NULL[在任何行为良好的程序中都不会发生std::string - 并且NULL输入到strtol是未定义的行为,因此没有定义在这种情况下p会发生什么 - 但您可能会因此类尝试而崩溃]。

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

你可以把它写成:

 return *p;

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

您似乎将"null 指针"与"指向 NULL 的指针"(无论后者是什么意思)混淆了。您引用的标准文本没有说明任何"指向 NULL 的指针"。您引用的文本清楚地明确表示,空指针已转换为false

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