为什么我们使用“const char * const * argv”而不是“char *”?

时间:2016-07-05 03:24:10

标签: c++ argv ns2

我正在使用“NS2 Simulator”模拟计算机网络。我真的不明白为什么我们应该使用const char* const* argv代替char *

我可以使用char *代替吗?关于这个问题有很多质量保证,但我对此感到困惑。请不要将此问题标记为“重复”。 为什么我们在下面的函数中使用const char* const* argv?这是c ++标准中的规则吗?我可以使用stringchar **代替吗?

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

3 个答案:

答案 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);
}

因此,如果您正在编写一个函数来接受参数数组参数(您的函数不会修改),那么它可能是最好的签名选择。