std::strtol的签名如下: long strtol(const char *str, char **str_end, int base); 我原本期望第二个参数的类型是const char**。为什么它实际上是char**类型呢?请注意,可以修改const char**类型的变量。您无法修改的是char* const *类型的变量。
在古老的时代(在C90之前),C语言没有const的概念,一切都使用普通的char*。 由于char*可以隐式转换为char const*,所以更改大多数库函数的签名以支持const并不是太大的问题。然而,char**不能转换为char const**,请参阅C++标准中的以下注释。 由于C语言不支持重载,委员会不得不在破坏遗留代码和强制每个人传入char**之间做出选择。两者都不是理想的选择,但看起来他们选择了后者。
str_end
指针,所以它必须是char **
。 - ForceBruconst char **
和char * const *
。 - Lingxichar foo [10] ="123z",*p; long l = strtol(foo,&p,10); * p = 0;
,我会期望它能够工作。这与C搜索函数采用const char *
但返回char *
的原因相同。 - Martin Bonner supports Monica