我想知道为什么argv
数组可以在以下代码中保存多字符元素:
#include <iostream>
int main(int argc, char *argv[])
{
for (int nArg = 0; nArg < argc; nArg++)
{
cout << nArg << " " << argv[nArg] << endl;
}
return 0;
}
代码只输出传递给程序的所有参数。
当我用参数foo
和bar
运行程序时,argv[1]
是foo
, argv[2]
是bar
。
但是argv
是char
的数组。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*
值,它将打印的不是指针值本身,而是它所指向的字符串的值。
当我用参数foo
和bar
运行程序时,argv[0]
是foo
,argv[1]
是bar
。
你确定吗?(更新:这是问题中的一个错字,现已更正。)如果您的程序名为"my_program",那么my_program foo bar
的输出应该类似于:
0 my_program
1 foo
2 bar
但是
argv
是char
的数组
更正:它是一个char *
的数组。"foo"
是一个char *
,所以这个可以工作。
char
的数组为char argv[]
。char *
的数组为char *argv[]
。
argv[0]是foo, argv[1]是bar
您应该注意到argv[0]
总是接收从shell调用的实际程序名,因此您的命令行参数从argv[1]
开始。
你差一个。
但是
argv
是char
的数组
它不是。这是一个char
指针的数组,这些指针指向(零终止)char
数组,即c风格的字符串。
严格来说,argv
不是数组,而是指向数组(包含char
指针的数组)的指针。更多细节请参见Keith Thompson对John Kugelman回答的评论