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:澄清我在代码中的任何地方都看不到一个空指针。我在代码中的任何地方都看不到一个空指针。