我想知道为什么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
?
答案 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 << ...
值,它将打印,而不是指针值本身,而是打印它指向的字符串的值。
当我使用参数foo
和bar
运行程序时,argv[0]
为foo
而argv[1]
为bar
。 击>
您确定吗?(更新:这是问题中的拼写错误,现已更正。)如果您的程序名为&#34; my_program&#34;,则输出{{ 1}}应该类似于:
my_program foo bar
答案 1 :(得分:1)
但
argv
是char
的数组。
更正:它是char *
的数组。 "foo"
是char *
,因此可行。
char
的数组是char argv[]
char *
的数组是char *argv[]
。这就是你所拥有的。
答案 2 :(得分:1)
argv [0]是foo,而argv [1]是吧......
您应该注意argv[0]
始终接收从shell调用的实际程序名称,因此命令行参数从argv[1]
开始。
你只是一个人。
答案 3 :(得分:0)
但
argv
是char
的数组。
不是。它是一个char
指针数组,这些指针指向(零终止)char
数组,即C风格的字符串。
从技术上讲,argv
不是数组,而是指向数组的指针(包含char
指针的数组)。有关详细信息,请参阅Keith Thompson对John Kugelman的回答。