命令行参数:argv

时间:2015-10-01 22:59:59

标签: c++

我想知道为什么argv数组可以在以下代码中包含多字符元素:

#include <iostream>

int main(int argc, char *argv[])
{
  for (int nArg = 0; nArg < argc; nArg++)
  {
    cout << nArg << " " << argv[nArg] << endl;
  }

  return 0;
}

代码只打印出传递给程序的所有参数。

当我使用参数foobar运行程序时,argv[1]fooargv[2]bar

argvchar的数组。 foo不是char,而是字符串。 argv[0]如何foo

4 个答案:

答案 0 :(得分:2)

argv实际上是一个指针,而不是一个数组。在C和C ++中,函数参数不能是数组。如果它看起来像一个数组,它会安静地调整&#34;在编译时,它是一个指向数组元素类型的指针。

此:

int main(int argc, char *argv[])

真的意味着:

int main(int argc, char **argv)

调用程序时,argv将初始化为指向char*对象。该对象是char*指针数组的初始元素,每个指针指向字符串的(初始元素) - 除了最后一个元素argv[argc]包含一个空指针。

argv[0]是指向表示程序名称的字符串的指针。如果使用两个参数调用程序,argv[1]argv[2]将指向这些参数。

最后,如果使用char*打印std::cout << ...值,它将打印,而不是指针值本身,而是打印它指向的字符串的值。

  

当我使用参数foobar运行程序时,argv[0]fooargv[1]bar

您确定吗?(更新:这是问题中的拼写错误,现已更正。)如果您的程序名为&#34; my_program&#34;,则输出{{ 1}}应该类似于:

my_program foo bar

答案 1 :(得分:1)

  

argvchar的数组。

更正:它是char *的数组。 "foo"char *,因此可行。

char的数组是char argv[] char *的数组是char *argv[]。这就是你所拥有的。

答案 2 :(得分:1)

  

argv [0]是foo,而argv [1]是吧......

您应该注意argv[0]始终接收从shell调用的实际程序名称,因此命令行参数从argv[1]开始。

你只是一个人。

答案 3 :(得分:0)

  

argvchar的数组。

不是。它是一个char指针数组,这些指针指向(零终止)char数组,即C风格的字符串。

从技术上讲,argv不是数组,而是指向数组的指针(包含char指针的数组)。有关详细信息,请参阅Keith Thompson对John Kugelman的回答。