将argv传递给函数时遇到了问题。基本上,我想将& argv [1]传递给函数并从中工作。但是,我不明白为什么以下方法有效:
void fun(char**&argv, const int& argc);
int main(int argc, char** argv)
{
fun(++argv, --argc);
return 0;
}
但以下情况不起作用:
void fun(char**&argv, const int& argc);
int main(int argc, char** argv)
{
fun(&argv[1], --argc);
return 0;
}
答案 0 :(得分:1)
原型:
void myfunc (char **argv, int argc)
使用示例:
myfunc (argv, argc)
如果你想传递一个字符串(argv [1]):
void myfunc (char *arg, int argc)
...
myfunc (argv[1], argc)
如果你想在argv [1]传递开始的字符串数组:
void myfunc (char **arg, int argc)
...
myfunc (&argv[1], argc)
答案 1 :(得分:1)
我尝试这个时得到的错误是argv [1]是一个临时值,你不能将它分配给非const引用。如果你这样做:
void fun( char** const&argv, const int& argc);
然后,++argv
或&argv[1]
将有效。
显然,如果您计划实际更改argv本身的值,这将不起作用,但我认为您不打算这样做,因为您没有传递对argv本身的引用,而是传递给argv中第二个条目的内存位置。
第一个工作原理而第二个不工作的原因是前面的++运算符修改变量,然后返回修改后的值,而不是变量本身。因此,变量可以作为参考传递给乐趣。但&argv[1]
只是内存位置的值。它是一个计算值,而不是一个变量,因此它不能作为非const引用传入。
如果您打算尝试更改argv
本身的值(将其指向不同的字符数组数组),那么&argv[1]
无论如何都不起作用,因为它是不是argv
。然而,++argv
是argv
,就在它调整了价值之后。
你也可以在没有引用的情况下处理所有这些,这会让事情变得更容易,但这取决于你。如果这是我的代码,我不会在这里使用引用。对int的const引用只能通过值传递(这会更容易),并且将引用传递给双指针不会保存任何空检查(因为它仍然可以为null)。所以没有太多意义。但如果您希望代码复杂,请随意。