命令行参数:argv



我想知道为什么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]foo, argv[2]bar

但是argvchar的数组。foo不是char,而是一个字符串。argv[0]怎么可能是foo ?

argv实际上是一个指针,而不是数组。在C和c++中,函数形参都不能是数组。如果它看起来像一个数组,它会在编译时被悄悄地"调整"为指向数组元素类型的指针。

:

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

真正的意思是:

int main(int argc, char **argv)

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

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

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

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

你确定吗?(更新:这是问题中的一个错字,现已更正。)如果您的程序名为"my_program",那么my_program foo bar的输出应该类似于:

0 my_program
1 foo
2 bar

但是argvchar的数组

更正:它是一个char *的数组。"foo"是一个char *,所以这个可以工作。

char的数组为char argv[]
char *的数组为char *argv[]

argv[0]是foo, argv[1]是bar

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

你差一个。

但是argvchar的数组

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

严格来说,argv不是数组,而是指向数组(包含char指针的数组)的指针。更多细节请参见Keith Thompson对John Kugelman回答的评论

最新更新