命令行参数:argv
Command line arguments: argv
我想知道为什么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回答的评论
- 在VS2013中使用devenv (C++)传递命令行参数argv
- 作为参数的'char *args[]'和'char **argv'之间的差异
- 静态变量需要在MAIN处理ARGV参数之前进行初始化
- 函数main中的参数argv(int argc,char *argv [])
- 如何在 GUI 程序 C++ 而不是控制台中传递 argv 参数
- 在 Argv 主参数中传递常量字符
- argc C++中的argv参数(游戏编程)
- argv[] 未注册参数
- 比较终端中通过char *argv []的参数
- C++ argv 参数不从命令行解析 *
- 如何在 Visual Studio 2015 调试中将'%'符号作为命令行参数 (argv) 传递?
- c++只允许在argv[1]中放置某些参数
- C++ 默认 argv(如果未在控制台中解析任何参数)
- int main(int argc,char* argv[]) 为什么 argc 给出 2 个参数
- 你能定义 main() 来接受不仅仅是 argc/argv 参数吗?
- 内存分配和**argv参数
- argv参数出现int main()问题
- 将argv参数转换为int
- 我怎么能得到QT主函数argv参数作为unicode编码格式
- CMakeLists.txt在配置中添加argv参数