C++ 为什么指向空字符的指针没有转换为false

C++ 为什么指向空字符的指针没有转换为false,c++,pointers,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 == '\

我认为指向
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;
}
#包括
#包括
#包括
#包括
bool是strtoi(const std::string和str)
{
char*p;
std::strtol(str.c_str(),&p,10);
返回*p=='\0';
}
bool是strtoi1(const std::string和str)
{
char*p;
std::strtol(str.c_str(),&p,10);
返回p;//指向NULL的指针应转换为false;
}
int main()
{
std::字符串test1(“123asd2”);
std::字符串test2(“123123”);

std::cout你是一个间接层!一个“空指针”和一个指向空/零的指针是两个不同的东西

最基本的是:


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

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

然而,更进一步,指针可以“值为零”的概念在抽象术语中,指针不是数字,因此我们不应该考虑一个空指针有一个数值,例如零。这在引入代码“> NulLPTR < /Cord>关键字时是明显的,它不能被隐式地转换成一个整数。,我们可以给出以下改进的更合适的示例:

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

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

最基本的是:


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

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

然而,更进一步,指针可以“值为零”的概念在抽象术语中,指针不是数字,因此我们不应该考虑一个空指针有一个数值,例如零。这在引入代码“> NulLPTR < /Cord>关键字时是明显的,它不能被隐式地转换成一个整数。,我们可以给出以下改进的更合适的示例:

p  == nullptr; // yes
*p == '\0';    // no
您似乎混淆了“空指针”和“指向空指针”(不管后者是什么意思)。您引用的标准文本没有说明任何“指向空指针”的内容。您引用的文本清楚明确地说明空指针已转换为
false

您发布的代码没有任何空指针,也就是说,它没有任何指针值为空的指针。代码中的指针
p
指向
str.c_str()中的某个有效位置
buffer,这意味着
p
本身不是空的。因此,您的代码中没有任何内容会按照标准引用的段落转换为
false

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

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

此代码:

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。

此代码:

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。

“空指针本身的值为零”=可能为true,但您不应该再相信它了。p!=nullptrsafer@MartinBeckett:澄清“空指针本身的值为零”=可能是真的,但你不应该再相信了。p!=nullptr是safer@MartinBeckett:澄清我在代码中的任何地方都看不到一个空指针。我在代码中的任何地方都看不到一个空指针。