我正在使用“NS2 Simulator”模拟计算机网络。我真的不明白为什么我们应该使用const char* const* argv
代替char *
?
我可以使用char *
代替吗?关于这个问题有很多质量保证,但我对此感到困惑。请不要将此问题标记为“重复”。
为什么我们在下面的函数中使用const char* const* argv
?这是c ++标准中的规则吗?我可以使用string
或char **
代替吗?
Function Connector::command.
//~ns/common/connector.cc
int Connector::command(int argc, const char*const* argv)
{
Tcl& tcl = Tcl::instance();
...
if (argc == 3) {
if (strcmp(argv[1], "target") == 0) {
...
target_ = (NsObject*)TclObject::lookup(argv[2]);
...
}
...
}
return (NsObject::command(argc, argv));
}
答案 0 :(得分:2)
const char*const* argv
表示“指向常量char的常量指针”。它与 char * 不同。 const修饰符有一个原因,因为argv指针不会被重新分配,元素必须通过下标来访问。
这使得调用者可以安全地动态分配argv,将其传递给command(),并在以后释放它。否则,如果在释放之前将指针指向其他位置,那么您已经泄漏了它用于指向的内存。
const char* const* argv
创建两个间接级别 - 第一级是const pointer to a const char
,第二级是指向const指针的指针。
答案 1 :(得分:0)
为什么我们应该使用" const ... argv"而不是" char *" ?
' const'来自你,程序员,命令编译器在你编写的代码尝试修改argv时通知你。
我可以使用char *代替吗?
可能,有时候并不重要。但是如果你错误地修改argv(或者const var name是什么),那么编译器不会让你知道你犯了一个错误,结果可能是你不想要的,甚至是UB。
答案 2 :(得分:0)
程序员可以 const限定参数,看看他们认为合适。这个签名的好处:
void func(const char* const* argv);
...它将接受参数数组(传递给main()
或exec()
的类型),具有任何const限定。
所以这些都是可以接受的:
int main(int, char** argv)
{
func(argv);
}
int main(int, const char** argv)
{
func(argv);
}
int main(int, char* const* argv)
{
func(argv);
}
int main(int, const char* const* argv)
{
func(argv);
}
因此,如果您正在编写一个函数来接受参数数组参数(您的函数不会修改),那么它可能是最好的签名选择。